Mysql большой набор данных запроса с условием столбца, который не индексируется - PullRequest
1 голос
/ 06 марта 2019

У меня есть таблица с именем user с 20 миллионами строк.Информация о таблице id, name, ctime и индексируется только id.

Я бы хотел запросить select min(id) from user where citme > 1521882950.

Время результата составляет около 7-10 секунд.

Когда я запрашиваю с select min(id) from user, время результата составляет около 10 мс.Я думаю, что причина в том, что id проиндексирован mysql.Таким образом, запрос выполняется быстро.

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

На странице разработчика mysql я обнаружил, что это объясняет индексирование , я не знаю, как применить большее условие.

SELECT MIN(key_part2),MAX(key_part2)
FROM tbl_name WHERE key_part1=10;

Ответы [ 2 ]

1 голос
/ 10 марта 2019

Для

SELECT MIN(key_part2),MAX(key_part2)
    FROM tbl_name WHERE key_part1=10;

вам нужно

INDEX(key_part1, key_part2)

Что у вас есть

SELECT MIN(key_part2)                     -- id
    FROM tbl_name WHERE key_part1=10;     -- ctime

, который нуждается

INDEX(ctime, id)

Однако вторичные индексы InnoDB автоматически включают в себя PK, так что просто

INDEX(ctime)

случается, имеет тот же эффект. (Я предпочитаю сказать INDEX(ctime, id) в качестве подсказки читателю, что мне нужна эта пара.)

«Поскольку индексирование ctime не столь значимо для таблицы» - ну, это было значимо для этого одного запроса! Итак, индексируйте его.

Без индекса вся таблица будет считана для обработки запроса.

С индексом будет считана только одна строка в INDEX для получения результата.

Это настолько экстремально, насколько это возможно (если не иметь индекса).

Между тем,

select min(id) from user

использует PRIMARY KEY и читает только одну строку, чтобы получить ответ.

"Я думаю, есть ли другой способ сделать запрос менее чем за 1 секунду без индексации столбца ctime?" Почему это имеет значение? Просто добавьте индекс и покончите с проблемой.

0 голосов
/ 07 марта 2019

Я спросил кого-то вокруг.Кажется, нет лучшего способа запросить столбец без индекса в течение нескольких секунд.В моем случае лучший способ быстрого запроса к MySQL - это индексирование столбца ctime.

Если есть лучший ответ, пожалуйста, обновите.

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