Быстрый поиск страниц в MySQL, использование индекса? - PullRequest
1 голос
/ 02 марта 2009

Я хотел бы ускорить запрос 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. Может кто-то угадает, что я делаю не так?

Ответы [ 3 ]

3 голосов
/ 02 марта 2009

Убедитесь, что у вас есть индекс (B-дерево) для time_id, это должно быть эффективно для запросов диапазона. Также убедитесь, что time_id имеет соответствующий формат времени.

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

http://dev.mysql.com/doc/refman/5.0/en/using-explain.html

1 голос
/ 02 марта 2009

Поскольку вероятно, что 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')
0 голосов
/ 03 марта 2009

Вам нужен нижний диапазон? Есть ли записи ранее 1901 года? Как создается столбец time_id? Если time_id всегда больше с каждой новой записью, добавляемой в БД, вы можете рассмотреть поиск идентификатора с ближайшей записью к 2009-01-16, а затем выбрать по идентификатору

select my_field_A, my_field_B
FROM
  mytable
WHERE
  id <= ?

Если это не так, попробуйте проверить разделение, доступное в MySQL 5.1, и разбейте таблицу по годам, что должно значительно увеличить скорость.

...