Какой наиболее эффективный тип данных для хранения категориальной строковой переменной в MySQL

У меня есть таблица с примерно 50 тыс. строк и несколькими столбцами. Некоторые столбцы имеют тип данных VARCHAR, но хранят уникальный набор значений, категориальные строки.

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

что я должен делать

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

Bernd Buffen 23.04.2022 15:20
3 метода стилизации элементов HTML
3 метода стилизации элементов HTML
Когда дело доходит до применения какого-либо стиля к нашему HTML, существует три подхода: встроенный, внутренний и внешний. Предпочтительным обычно...
Формы c голосовым вводом в React с помощью Speechly
Формы c голосовым вводом в React с помощью Speechly
Пытались ли вы когда-нибудь заполнить веб-форму в области электронной коммерции, которая требует много кликов и выбора? Вас попросят заполнить дату,...
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Будучи разработчиком веб-приложений, легко впасть в заблуждение, считая, что приложение без JavaScript не имеет права на жизнь. Нам становится удобно...
Flatpickr: простой модуль календаря для вашего приложения на React
Flatpickr: простой модуль календаря для вашего приложения на React
Если вы ищете пакет для быстрой интеграции календаря с выбором даты в ваше приложения, то библиотека Flatpickr отлично справится с этой задачей....
В чем разница между Promise и Observable?
В чем разница между Promise и Observable?
Разберитесь в этом вопросе, и вы значительно повысите уровень своей компетенции.
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Клиент для URL-адресов, cURL, позволяет взаимодействовать с множеством различных серверов по множеству различных протоколов с синтаксисом URL.
1
1
26
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я предполагаю, что под «категорией» вы подразумеваете, что эти столбцы имеют «контролируемый словарь» — ограниченный набор возможных значений.

Некоторые вещи, которые вы можете сделать, чтобы эта таблица служила вам более эффективно. Вам не обязательно делать их все. Я перечисляю их в порядке сложности (по крайней мере для меня).

  1. Поместите индексы в столбец или столбцы, которые вы будете использовать в предложениях WHERE при запросе. Это, скорее всего, решит ваши проблемы с производительностью: 50 000 строк — это не мало, а мало.

    Правильный выбор индекса — это искусство. Посетите https://use-the-index-luke.com для ознакомления. Или задайте другой вопрос здесь, если у вас есть проблемы с производительностью при выполнении определенных запросов.

  2. Если возможно и если необходимо, объявите эти столбцы с помощью COLLATE latin1_bin. Это делает их короче и ускоряет их поиск. Это не сработает, если ваши категориальные значения указаны на арабском или другом языке, для которого требуется Unicode.

  3. Сделать новую таблицу. Может быть, назовите его category и дайте ему столбец INT UNSIGNED для category_id и столбец VARCHAR для category_name. Затем в вашей основной таблице используйте столбцы INT UNSIGNED, а не столбцы VARCHAR: рассматривайте новую таблицу как таблицу поиска, а столбцы в вашей основной таблице — как числовые ссылки на эту таблицу.

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

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

Другие вопросы по теме