Важность длины varchar в таблице MySQL



У меня есть таблица MySQL, где строки вставляются динамически. Поскольку я не могу быть уверен в длине строк и не хочу их отрезать, я делаю их varchar(200), который обычно намного больше, чем мне нужно. Есть ли большой хит производительности в предоставлении поля varchar гораздо большей длины, чем это необходимо?

629   10  

10 ответов:

нет, в том смысле, что если значения, которые вы храните в этом столбце, всегда (скажем) меньше 50 символов, объявляя столбец как varchar(50) или varchar(200) имеет такую же производительность.

есть одно возможное влияние на производительность: в MySQL, временных таблицах и MEMORY таблицы хранят a VARCHAR столбец как столбец фиксированной длины, дополненный до максимальной длины. Если вы проектируете VARCHAR столбцы намного больше, чем самый большой размер вам нужно, вы будете потреблять больше памяти, чем вам нужно. Это влияет на эффективность кэша, скорость сортировки и т. д.

VARCHAR идеально подходит для ситуации, которую вы описываете, потому что это означает "переменный символ" - предел, основанный на вашем примере, будет 200 символов, но все меньше принимается и не будет заполнять выделенный размер столбца.

VARCHAR также занимает меньше места - значения хранятся в виде однобайтового или двухбайтового префикса длины плюс данные. Префикс длины указывает количество байтов в значении. Столбец использует один байт длины, если значения не требуют больше чем 255 байт, два байта длины, если значения могут потребовать более 255 байт.

для получения дополнительной информации, сравнивающей символ MySQL с типами данных VARCHAR, см. этой ссылке.

размер производительности! Чем меньше размер, тем лучше. Не сегодня и не завтра, но когда-нибудь ваши столы вырастут до размеров, когда дело дойдет до серьезных узких мест, независимо от того, какой дизайн вы выложили. Но вы можете предвидеть некоторые из тех потенциальных узких мест на этапе проектирования, которые, вероятно, произойдут первыми, и попытаться расширить время, когда ваша БД будет работать быстро и счастливо, пока вам не понадобится переосмыслить свою схему или масштабировать горизонтально, добавив больше серверов.

в вашем случае есть много утечек производительности, с которыми вы можете столкнуться: большие соединения почти невозможны с long varchar столбцы. Индексация по этим столбцам-настоящий убийца. Ваш диск должен хранить данные. Одна страница памяти может содержать меньше строк, а сканирование таблиц будет намного медленнее. Также кэш запросов вряд ли поможет вам здесь.

вы должны спросить себя: сколько вставок в год может произойти? Какова средняя длина? Мне действительно нужно больше 200 символов или я могу поймать это в своем приложение front-end, даже информируя пользователей о максимальной длине? Могу ли я разделить таблицу на узкую для быстрого индексирования и сканирования и другую для хранения дополнительных, менее часто необходимых данных расширяющегося размера? Могу ли я ввести возможные данные varchar в категории и таким образом извлечь некоторые данные в несколько меньших, возможно, int или bool-типа столбцов и сузить столбец varchar таким образом?

здесь можно многое сделать. Может быть, лучше всего пойти с первым предположением и затем перепроектировать шаг за шагом, используя реальные измеренные данные производительности. Удача.

производительность? Нет. Дисковое хранилище? Да, но это дешево и много. Если ваша база данных не вырастет до терабайтного масштаба, вы, вероятно, в порядке.

некоторые из вас ошибаются, думая, что varchar(200) занимает больше размера таблицы на диске, чем varchar(20). Но это не так. Только когда вы выходите за пределы 255 символов, mysql использует дополнительный байт для определения длины varchar данные поля.

там могут быть хиты производительности - но обычно не на уровне, который большинство пользователей заметят.

когда размер каждого поля известен заранее, MySQL точно знает, сколько байтов находится между каждым полем / строкой и может перелистывать страницу вперед, не читая все данные. Использование переменных символов уменьшает эту способность для оптимизации.

приводит ли varchar к снижению производительности из-за фрагментации данных?

еще лучше, char vs тип varchar.

для большинства применений, вы будете в порядке с любым - но там и разница, и для крупномасштабных баз данных, есть причины, почему вы выбрали бы один или другой.

будучи varchar, а не просто char, размер основан на внутреннем поле, чтобы указать его фактическую длину и саму строку. Таким образом, использование varchar(200) не очень отличается от использования varchar(150), за исключением того, что у вас есть потенциал для хранения больше.

и вы должны рассмотреть, что происходит при обновлении, когда строка растет. Но если это редкость, то вы должны быть хорошо.

в соответствии с именем типа данных предполагает, что это VARCHAR т. е. переменная chars хранения данных, mysql engine сам выделяет память используется в соответствии с сохраненными данными, так что нет хит производительности в соответствии с моими знаниями.

вы должны попытаться просмотреть столбец varchar так же, как и столбец char в большинстве сценариев, и установить длину консервативно. Вам не обязательно всегда думать о модификаторе var, так как это влияет на принятие решений по максимальной длине. Это действительно следует рассматривать как подсказку производительности, а не то, что поставляемые строки будут разной длины.

Это не директива, которая должна строго следовать внутренним базам данных, она может быть полностью проигнорирована. Однако позаботьтесь об этом, поскольку иногда реализация может протекать (например, фиксированная длина и прокладка), хотя это не должно быть в идеальном мире.

Если у вас есть varchar(255), то у вас нет гарантии, что производительность будет всегда вести себя по-разному с char(255) при любых обстоятельствах.

может показаться, что легко установить его на что-то вроде 255, 65535 и т. д. В соответствии с рекомендациями, приведенными в руководстве о требованиях к хранению. Это дает впечатление, что любое значение между 0 (Да, это вещь) и 255 будет иметь такое же влияние. Однако это не то, что может быть полностью гарантирована.

требования к хранению имеют тенденцию быть истинными или хорошим показателем для достойных и зрелых постоянных механизмов хранения с точки зрения хранения строк. Это не такой сильный индикатор для таких вещей, как индексы.

это иногда сложный вопрос, как долго должен быть кусок строки, чтобы установить его до самой высокой границы вы знаете, что это должно быть внутри, но это не имеет никакого влияния. К сожалению, это часто что-то осталось для пользователя, чтобы работать, и это действительно несколько произвольно. Вы не можете сказать, что никогда не увеличивайте строку, потому что, возможно, есть случаи, когда вы не совсем уверены.

вы должны убедиться, что запросы MySQL выдают ошибку, когда строка слишком длинная, а не усекается, чтобы по крайней мере вы знали, может ли она быть слишком короткой из-за ошибок. Изменение размера столбцов для их увеличения или уменьшения может быть дорогостоящая операция DDL, это следует иметь в виду.

набор символов также следует учитывать, где длина и производительность вступают в игру. Длина относится к этому, а не к байтам. Если использовать utf8 например, (не MB4), то varchar(255) действительно varbinary (3 * 255). Трудно понять, как такие вещи будут действительно играть без запуска тестов и глубокого изучения исходного кода/документации. Из-за этого есть возможность для чрезмерной длины, чтобы иметь неожиданно раздутый удар. это относится не только к производительности. Если вам однажды нужно будет изменить набор символов столбца varchar на более крупный, то вы можете в конечном итоге попасть в какой-то предел без обращения, если вы позволили безвозмездно длинным строкам присутствовать, чего можно было бы избежать. Это обычно довольно нишевая проблема, но она возникает, недавно это была значительная проблема с введением utf8 для MySQL и индексов, которые имеют ограничение на ключ длина.

Если окажется, что MAX(LENGTH(column)) всегда

Это может включать в себя:

  • различные двигатели, некоторые могут игнорировать его вообще.
  • размеры буфера, например обновление или вставка может придется выделить полные 255 (хотя я не проверял исходный код, чтобы доказать это, это только гипотетически).
  • индексы, это будет сразу очевидно, если вы попытаетесь сделать составной ключ из большого количества столбцов varchar(255).
  • промежуточные таблицы и, возможно, результирующие наборы. Учитывая способ работы транзакций, не всегда возможно, чтобы что-то использовало фактическую максимальную длину строк в столбце, а не определенную предел.
  • внутренние прогностические оптимизации могут принимать максимальную длину в качестве входных данных.
  • изменения в версиях реализации базы данных.

Как правило, на самом деле нет необходимости в том, чтобы varchar был дольше, чем это должно быть в любом случае, проблемы с производительностью или нет, поэтому я рекомендую придерживаться этого, когда вы можете. Принимая больше усилий для выборки размера ваших данных, обеспечить соблюдение истинного предела или выяснить истинный предел через запрос / исследование является идеальным подход.

когда вы не можете, если вы хотите сделать что-то вроде varchar(255) для случаев, когда вы сомневаетесь, то я рекомендую делать науку. Это может состоять из дублирования таблицы, уменьшения размера столбца var char, затем копирования данных в него из оригинала и просмотра размера данных индекса/строки (индексируйте столбец, а также попробуйте его в качестве первичного ключа, который может вести себя по-разному в InnoDB, поскольку строки упорядочены первичным ключом). По крайней мере, так вы будете знайте, если у вас есть влияние на IO, который, как правило, является одним из самых чувствительных узких мест. Тестирование на использование памяти сложнее, это трудно проверить, что исчерпывающе. Я бы рекомендовал тестировать потенциальные худшие случаи (запросы с большим количеством промежуточных результатов в памяти, проверка с объяснением для больших временных таблиц и т. д.).

Если вы знаете, что в таблице не будет много строк, вы не будете использовать столбец для соединений, индексов (особенно составных, уникальных) и т. д., Тогда вы скорее всего, не будет много проблем.

Comments

    Ничего не найдено.