2009-03-02 2 views
1

Я хотел бы ускорить запрос MySQL, который в основном восстановить страницу данных по образцу нижеБыстрый поиск страниц в 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, тем не менее, запрос ведет себя так, как будто вся база данных была прочитана в каждой query (получение пары строк уже довольно медленно). Я не эксперт в MySQL. Может ли кто-то угадать, что я делаю неправильно?

+0

«time_id должен быть индексом MySQL», но вы уверены, что это так? 'показать индексы из [таблицы]' – jonstjohn

ответ

3

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

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

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

1

Поскольку, возможно, существует множество time_id, подпадающих под эти критерии, MySQL может подумать, что полное сканирование таблицы лучше.

Try принуждая индекс:

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

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

select my_field_A, my_field_B 
FROM 
    mytable 
WHERE 
    id <= ? 

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

Смежные вопросы