Можете ли вы создать индекс, чтобы определить, является ли текстовый столбец пустым в mysql? - PullRequest
0 голосов
/ 23 апреля 2019

У меня очень большая (> 100 миллионов строк) таблица, и запрос, который мне нужно написать, должен проверить, является ли столбец типа TEXT пустым.Мне плевать на фактический текст, только если значение столбца равно нулю или нет.

Я пытаюсь написать индекс, чтобы сделать этот запрос эффективным, и я хочу, чтобы запрос был удовлетворен толькоглядя на индекс, например, такой, что вывод объяснения *1005* этого запроса показывает Using index вместо Using index condition.

Конкретно, таблица, с которой я имею дело, имеет такую ​​структуруэто:

CREATE TABLE foo (
    id INT NOT NULL AUTO_INCREMENT,
    overridden TEXT,
    rowState VARCHAR(32) NOT NULL,
    active TINYINT NOT NULL DEFAULT 0,
    PRIMARY KEY (id),
) ENGINE=InnoDB

И запрос, который я хочу, это:

SELECT 
    IF(overridden IS NULL, "overridden", rowState) AS state, 
    COUNT(*)
FROM foo 
WHERE active=1
GROUP BY state

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

Я пытался создать индекс для (active, rowState, overridden(1)), но вывод объяснения по-прежнему показывает Using index condition.

Есть что-то лучшее, что я мог бы сделать?

1 Ответ

0 голосов
/ 28 апреля 2019

Я подозреваю, что это было бы хорошим приложением для индекса "префикса". (Большинство попыток использовать такие являются фиаско.)

Оптимальный порядок, я думаю, будет:

INDEX(active,         -- handle the entire WHERE first
      overridden(1),  -- IS NULL possibly works well
      rowState)       -- to make index "covering"

Using index condition означает, что выбор строки (ей) обрабатывается в Engine, а не в «Обработчике».

EXPLAIN FORMAT=JSON SELECT ... может дать более глубокое понимание того, что происходит. Так может и «Трассировка оптимизатора».

Или ...

Если версия MySQL достаточно новая, создайте «сгенерированный столбец», который сохраняется с вычисленным значением overridden IS NULL.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...