Быстрый поиск страниц в MySQL, использование индекса?
-
03-07-2019 - |
Вопрос
Я хотел бы ускорить запрос MySQL, который в основном извлекает страницу данных, следуя приведенному ниже шаблону
select
my_field_A,
my_field_B
where
time_id >= UNIX_TIMESTAMP('1901-01-01 00:00:00') AND
time_id < UNIX_TIMESTAMP('2009-01-16 00:00:00')
Поле time_id
является индексом MySQL, тем не менее, запрос ведет себя так, как если бы при каждом запросе считывалась вся база данных (извлечение пары строк уже происходит довольно медленно).Я не эксперт в MySQL.Может кто-нибудь догадаться, что я делаю не так?
Решение
Убедитесь, что у вас есть индекс (B-дерево) для time_id, это должно быть эффективно для запросов диапазона.Также убедитесь, что time_id указан в соответствующем формате time.
Если вы действительно хотите понять, что делает mysql, вы можете добавить ключевое слово "explain" перед запросом и запустить его в вашем клиенте mysql.Это покажет некоторую информацию о том, что делает mysql и какие виды сканирования выполняются.
Другие советы
Поскольку, вероятно, существует множество time_id
подпадает под эти критерии, MySQL
возможно, вы подумаете, что полное сканирование таблицы лучше.
Попробуйте принудительно ввести индекс:
SELECT
my_field_A,
my_field_B
FROM mytable FORCE INDEX (index_name_on_time_id)
WHERE
time_id >= UNIX_TIMESTAMP('1901-01-01 00:00:00') AND
time_id < UNIX_TIMESTAMP('2009-01-16 00:00:00')
Вам нужен более низкий диапазон?Есть ли какие-либо записи ранее 1901 года?Как генерируется столбец time_id?Если time_id всегда больше с каждой новой записью, добавляемой в базу данных, вы можете рассмотреть возможность поиска идентификатора с ближайшей записью к 2009-01-16, а затем выбрать по идентификатору
select my_field_A, my_field_B
FROM
mytable
WHERE
id <= ?
Если это не так, попробуйте проверить разбиение на разделы в "доступно из MySQL 5.1" и разбейте таблицу по годам, это должно значительно увеличить скорость.