Ви повинні спробувати переглянути колонку varchar такою ж, як і у стовпці char, у більшості сценаріїв і встановити довжину консервативно. Вам не потрібно завжди думати про модифікатор var настільки, як на щось, що впливає на прийняття рішення на максимальну довжину. Це дійсно слід розглядати як натяк на ефективність, а не те, що надані рядки будуть різної довжини.
Це не директива, якої слід суворо дотримуватися внутрішніми базами даних, її можна повністю ігнорувати. Але будьте обережні з цим, оскільки іноді реалізація може просочитися (наприклад, фіксованою довжиною і накладкою), хоча це не повинно бути в ідеальному світі.
Якщо у вас варчар (255), то ви не маєте гарантії, що ефективність роботи завжди буде поводитися по-різному зі статусом (255) за будь-яких обставин.
Це може здатися просто встановити на щось таке, як 255, 65535, тощо, відповідно до порад, наданих у посібнику щодо вимог щодо зберігання. Це створює враження, що будь-яке значення між 0 (так, це річ) і 255 матиме однаковий вплив. Однак це не те, що можна повністю гарантувати.
Вимоги до зберігання, як правило, є правдою або хорошим показником для гідних та зрілих систем постійного зберігання з точки зору зберігання рядків. Це не такий сильний показник для таких речей, як індекси.
Іноді буває складно питання, скільки саме повинен бути такий шматок струни, щоб встановити його до найвищої межі, ви знаєте, що це повинно бути, але це не має впливу. На жаль, користувачеві це часто щось залишається для розробки, і це справді дещо довільно. Насправді ви не можете сказати, що ніколи не збільшувати розмір рядка, тому що, можливо, є випадки, коли ви не зовсім впевнені.
Ви повинні переконатися, що запити MySQL видають помилку, коли рядок занадто довгий, а не усічений, щоб, принаймні, ви знали, чи може це бути занадто коротко від викидів помилок. Зміна розміру стовпців для їх збільшення або зменшення може бути дорогою операцією DDL. Це слід пам’ятати.
Набір символів також слід враховувати, де тривалість і продуктивність вступають у гру. Довжина стосується цього, а не байтів. Якщо, наприклад, використовується utf8 (не MB4), то varchar (255) справді є варбінарним (3 * 255). Важко знати, як подібні речі справді розігруватимуться без запуску тестів та глибокого погляду на вихідний код / документацію. Через це існує можливість, щоб надмірна довжина мала несподівано завищений вплив. це не стосується лише продуктивності. Якщо вам одного дня потрібно змінити набір символів стовпчика варшара на більший, ви можете в кінцевому підсумку досягти деякої межі без регресу, якщо ви дозволили б присутні безперечно довгі рядки, яких можна було б уникнути. Зазвичай це досить ніша проблема, але вона виникає,
Якщо виявиться, що MAX (LENGTH (стовпець)) завжди <64 (наприклад, якби було вирішено, що буде обмеження на вхід, який не відповідає визначенню стовпця), але у вас є varchar (255), то є хороший шанс, що ви будете використовувати в чотири рази більше місця, ніж потрібно в деяких сценаріях.
Це може включати:
- Різні двигуни, деякі можуть взагалі проігнорувати це.
- Розміри буфера, наприклад, оновлення або вставки, можливо, доведеться виділити цілі 255 (хоча я не перевіряв вихідний код, щоб довести це, це лише гіпотетична).
- Покажчики, це стане очевидним, якщо ви спробуєте скласти складний ключ із безлічі вархарських (255) стовпців.
- Проміжні таблиці та, можливо, набори результатів. Враховуючи спосіб роботи транзакцій, можливо, не завжди можливо щось використовувати фактичну максимальну довжину рядків у стовпці на відміну від визначеної межі.
- Внутрішні оптимізації прогнозування можуть сприймати максимальну довжину як вхід.
- Зміни у версіях реалізації бази даних
Як правило, дійсно не потрібно, щоб варчар був довшим, ніж це повинно бути в будь-якому випадку, питання щодо продуктивності чи ні, тому я рекомендую дотримуватися цього, коли можете. Доклавши більше зусиль для вибірки розміру ваших даних, застосуйте істинний ліміт або з’ясувати справжню межу шляхом запитання / дослідження - це ідеальний підхід.
Коли ви не можете, якщо ви хочете зробити щось на зразок varchar (255) для випадків, коли сумніваєтесь, то рекомендую займатися наукою. Це може складатися з дублювання таблиці, зменшення розміру стовпця var char, а потім копіювання даних у неї з оригіналу та перегляду розміру даних індексу / рядка (також індексуйте стовпець, а також спробуйте це як первинний ключ, який може поводитися по-різному в InnoDB, оскільки рядки впорядковані первинним ключем). По крайней мере, таким чином ви дізнаєтесь, чи маєте ви вплив на IO, який, як правило, є одним з найбільш чутливих вузьких місць. Тестування на використання пам'яті складніше, важко перевірити це вичерпно. Я рекомендую протестувати потенційні найгірші випадки (запити з великою кількістю проміжних результатів у пам'яті, перевірити з поясненням щодо великих темп-таблиць тощо).
Якщо ви знаєте, що в таблиці не буде багато рядків, ви не збираєтесь використовувати стовпчик для з'єднань, індексів (особливо складових, унікальних) тощо, то, швидше за все, у вас не буде багато проблем.
VARCHAR(255) utf8mb4
стовпцем з ~ 150k рядків вимірювала 11,5 Мб. Таблиця зVARCHAR(48) utf8mb4
індексованим стовпцем з тими ж даними (максимальна довжина 46 символів) використовувала 4,5 Мб. Не дуже велика різниця в запитах, вона індексується. Але він доповнює запити вводу-виводу та такі речі, як резервне копіювання бази даних.