У меня есть таблица MySQL InnoDB со столбцом состояния. Статус может быть «выполнен» или «обрабатывать». По мере роста таблицы не более 1% значений статуса будет «обрабатывать», тогда как остальные 99,9% значений будут «сделаны». Это кажется отличным кандидатом на индекс из-за высокой избирательности для «обработки» (хотя и не для «сделанного»). Можно ли создать индекс для столбца состояния, который индексирует только значение «обработка»? Я не хочу, чтобы индекс тратил огромное количество индексации пространства «сделано».Индексирование только одного значения столбца MySQL
ответ
Я не знаю ни стандартным способом для этого, но мы решили аналогичную проблему раньше, используя две таблицы: Processing
и Done
в вашем случае, первый с индексом, последний без.
Предполагая, что строки никогда не переключаться от done
к processing
, вот шаги, которые вы можете использовать:
- При создании записи, вставьте его в
Processing
таблицу с колонкой, установленной наprocessing
. - Когда все будет готово, установите столбец в
done
. - Периодически подметайте таблицу
Processing
, перемещаясьdone
строки в таблицуDone
.
Это последнее непросто. Вы можете выполнить вставку/удаление в транзакции, чтобы обеспечить ее правильную передачу, или вы можете использовать уникальный идентификатор, чтобы определить, был ли он уже перенесен, а затем просто удалить его с Processing
(у меня нет опыта работы с поддержкой транзакций MySQL, поэтому я также предоставляя этот вариант).
Таким образом, вы только индексируете несколько из 99,9% строк done
, которые еще не переданы в таблицу Done
. Он также будет работать с несколькими состояниями processing
, о которых вы указали в комментариях (записи передаются только тогда, когда они попадают в состояние done
, все остальные штаты остаются в таблице Processing
).
Это сродни наличию исторических данных (материал, который больше никогда не изменится) переносится на отдельную таблицу для повышения эффективности. Это может усложнить некоторые запросы, где вам нужен доступ как к done
, так и к номерам не done
, так как вам нужно присоединиться к двум таблицам, поэтому имейте в виду, что есть компромисс.
Лучшее решение: не используйте строки для указания статусов. Вместо этого используйте константы в вашем коде с дескриптивными именами => целочисленными значениями. Затем это целое число хранится в базе данных, а MySQL будет работать LOT быстрее, чем со строками.
Я не знаю, какой язык вы используете, но, например, в PHP:
class Member
{
const STATUS_ACTIVE = 1;
const STATUS_BANNED = 2;
}
if ($member->getStatus() == Member::STATUS_ACTIVE)
{
}
вместо того, что у вас есть сейчас:
if ($member->getStatus() == 'active')
{
}
Спасибо за ответ.Строки на самом деле являются ENUM, что означает, что они отображаются на целые числа. Хотя ваше предложение действительно, оно не попадает в корень моего вопроса: нужно ли это, и если да, то как я могу индексировать только определенное значение в столбце? – BrainCore
- 1. MySQL MyISAM индексирование текстового столбца
- 2. mysql используя DISTINCT только для одного столбца
- 3. Mysql значения выберите счета из одного столбца
- 4. MySQL - UPDATE одного значения столбца с помощью одного запроса
- 5. Суммируя значения одного столбца только до глубины другого столбца
- 6. PHP MySQL, где часть значения столбца только
- 7. SQL-запрос для возврата только первого значения одного значения столбца
- 8. Добавить значения одного столбца
- 9. Mysql - Только строки, значения из одного столбца соответствуют всем из другого столбца
- 10. Как получить значения только одного столбца, используя Hibernate
- 11. mysql - результат запроса фильтра, основанный на подсчете значения одного столбца?
- 12. Обновления значения одного столбца таблицы
- 13. MYSQL запрашивает значения из одного столбца после повторного сопоставления user_id
- 14. Получить различные значения одного столбца
- 15. MySQL: хранить только 1 правильный ответ (индексирование)
- 16. MySQL: Выберите несколько строк, содержащих значения из одного столбца
- 17. как подсчитать конкретные значения из одного столбца в mysql
- 18. MYSQL многоколоночное индексирование
- 19. Mysql: Обновить значения одного столбца со значениями из нескольких столбцов
- 20. Индексирование разделов таблицы в MySql
- 21. Отличие только от одного столбца
- 22. Индексирование позиции изменения значения
- 23. Перечислить значения одного столбца другим
- 24. Подсчитайте разные строки одного столбца в mysql
- 25. Таблица MySQL для одного столбца
- 26. Обновление только одного значения столбца с использованием LINQ
- 27. Удалить повторяющиеся значения на основе только одного столбца таблицы
- 28. PHP/MYSQL Получение только одного столбца Значение по ID
- 29. Выбор только одного столбца вместо всех столбцов в запросе mysql
- 30. «на обновление CURRENT_TIMESTAMP» только для одного столбца в MySQL
Просто интересно, было бы проще преобразовать в бит столбца с именем «обработка», где значение будет либо «1», либо «0». Будет меньше пространства. (Если у вас более 2 статусов) –
Хорошее предложение. На самом деле у меня есть более двух статусов, но я упростил это ради простоты. – BrainCore
«но я упростил это ради простоты» - тогда все в порядке, если вы не упростили его по другой причине :-) – paxdiablo