Вы должны попытаться просмотреть столбец varchar так же, как столбец char в большинстве сценариев, и установить длину консервативно. Вам не нужно всегда думать о модификаторе var как о чем-то, что влияет на принятие решения о максимальной длине. Это действительно следует рассматривать как подсказку производительности, а не то, что поставляемые строки будут иметь разную длину.
Это не директива, которой должны строго следовать внутренние компоненты базы данных, ее можно полностью игнорировать. Однако будьте осторожны с этим, поскольку иногда реализация может протекать (например, фиксированная длина и заполнение), даже если в идеальном мире этого не должно быть.
Если у вас есть varchar (255), у вас нет гарантии, что с точки зрения производительности он всегда будет вести себя иначе, чем char (255) при любых обстоятельствах.
Может показаться, что легко установить для него что-то вроде 255, 65535 и т. Д. В соответствии с рекомендациями, приведенными в руководстве о требованиях к хранению. Создается впечатление, что любое значение от 0 (да, это вещь) до 255 будет иметь такое же влияние. Однако это не то, что можно полностью гарантировать.
Требования к хранилищу, как правило, верны или являются хорошим показателем для достойных и зрелых механизмов постоянного хранения с точки зрения хранилища строк. Это не такой сильный индикатор для таких вещей, как индексы.
Иногда возникает сложный вопрос, какой длины должен быть кусок строки, чтобы установить его наивысшую границу, в пределах которой, как вы знаете, она должна быть, но это не имеет никакого значения. К сожалению, это часто остается на усмотрение пользователя, и это действительно несколько произвольно. Вы не можете действительно сказать никогда не увеличивать размер строки, потому что могут быть случаи, когда вы не совсем уверены.
Вы должны убедиться, что запросы MySQL выдают ошибку, когда строка слишком длинная, а не усекается, чтобы, по крайней мере, вы знали, может ли она быть слишком короткой, по выбросам ошибок. Изменение размера столбцов для их увеличения или уменьшения может быть дорогостоящей операцией DDL, об этом следует помнить.
Также следует учитывать набор символов, когда важны длина и производительность. Длина относится к этому, а не к байтам. Например, если вы используете utf8 (не MB4), тогда varchar (255) действительно является varbinary (3 * 255). Трудно понять, как такие вещи действительно будут развиваться, не проводя тесты и не углубляясь в исходный код / документацию. Из-за этого чрезмерная длина может иметь неожиданно завышенный удар. это касается не только производительности. Если вам однажды понадобится изменить набор символов столбца varchar на более крупный, то вы можете в конечном итоге достичь некоторого предела без обращения, если вы позволите присутствовать необоснованно длинным строкам, которых можно было бы избежать. Обычно это довольно узкая проблема, но она возникает,
Если окажется, что MAX (LENGTH (столбец)) всегда <64 (например, если было решено, что будет лимит на ввод, который не соответствует определению столбца), но у вас есть varchar (255), тогда есть хороший шанс, что вы будете использовать в четыре раза больше места, чем необходимо в некоторых сценариях.
Это может включать:
- Разные двигатели, некоторые могут вообще игнорировать.
- При размерах буфера, например при обновлении или вставке, может потребоваться выделить все 255 (хотя я не проверял исходный код, чтобы доказать это, это всего лишь гипотеза).
- Индексы, это сразу станет очевидно, если вы попытаетесь создать составной ключ из множества столбцов varchar (255).
- Промежуточные таблицы и, возможно, наборы результатов. Учитывая способ работы транзакций, не всегда возможно использовать фактическую максимальную длину строк в столбце в отличие от определенного предела.
- Внутренняя прогнозная оптимизация может принимать в качестве входных данных максимальную длину.
- Изменения в версиях реализации базы данных.
Как показывает практика, на самом деле нет необходимости в том, чтобы varchar был длиннее, чем он должен быть, в любом случае, проблемы с производительностью или нет, поэтому я рекомендую придерживаться этого, когда вы можете. Приложить больше усилий для выборки размера ваших данных, установления истинного предела или определения истинного предела путем опроса / исследования - это идеальный подход.
Когда вы не можете, если вы хотите сделать что-то вроде varchar (255) в случае сомнений, я рекомендую заняться наукой. Это может состоять в дублировании таблицы, уменьшении размера столбца var char, затем копировании данных в него из оригинала и просмотре размера данных индекса / строки (также индексируйте столбец, также попробуйте его как первичный ключ, который может вести себя иначе в InnoDB, поскольку строки упорядочены по первичному ключу). По крайней мере, так вы узнаете, повлияете ли вы на ввод-вывод, который, как правило, является одним из самых уязвимых узких мест. Тестировать на использование памяти сложнее, это сложно проверить полностью. Я бы порекомендовал протестировать возможные худшие случаи (запросы с большим количеством промежуточных результатов в памяти, проверка с объяснением для больших временных таблиц и т. Д.).
Если вы знаете, что в таблице не будет много строк, вы не собираетесь использовать столбец для объединений, индексов (особенно составных, уникальных) и т. Д., Тогда у вас, скорее всего, не будет много проблем.
VARCHAR(255) utf8mb4
Размер таблицы с одним индексированным столбцом с ~ 150 тыс. Строк составляет 11,5 МБ. Таблица сVARCHAR(48) utf8mb4
индексированным столбцом с теми же данными (максимальная длина 46 символов) занимала 4,5 МБ. Не особо большая разница в запросах, индексируется. Но это добавляется к вводу-выводу запросов и таким вещам, как резервное копирование базы данных.