Тормозит запрос

mike

pmcoder
Тормозит запрос

Таблица 89570 записей.
Запрос
PHP:
SELECT  *
FROM table
ORDER BY primary_key DESC
LIMIT 89520, 50
выполняется 30 секунд.

А вот запрос
PHP:
SELECT *
FROM table
ORDER BY primary_key DESC
LIMIT 89520, 49
выполняется 0.3 сек

Другими словами, если в LIMIT попадает первая запись таблицы наблюдаюся жуткие тормоза. Если без первой записи - все ок.
Пробовал удалять первую запись - все сдвигается на единицу, т.е. LIMIT 89520, 49 тормозит, LIMIT 89520, 48 - не тормозит.
Картина одинакова как на виндовой локальной машине так и на юниксовом продакшн сервере.
Что делать?
 

mike

pmcoder
Первая запись такая же как и остальные.
Не имеет значение какая она.
Я пробовал удалять запись. Я об этом выше написал.
 

Mr_Max

Первый класс. Зимние каникулы ^_^
Команда форума
Что в екплайне?
 

mike

pmcoder
PHP:
id 	select_type 	table 	type 	possible_keys 	key 	key_len 	ref 	rows 	Extra 
1	SIMPLE	pt_mails_journal	ALL	NULL	NULL	NULL	NULL	89568	Using filesort
 

dimagolov

Новичок
mike, EXPLAIN смотреть не пробовал?

прикольно, что на MyISAM стабильно не юзается индекс при таком запросе (ALL, filesort). на InnoDB индекс юзается тоже вне зависимости от попадания первой записи, но показывает в rows limit_start+limit_num rows, что, вероятно, не правда, т.к. скорость по сравнению с MyISAM отличается на порядок
 

mike

pmcoder
А вот для запроса без первой записи:
PHP:
id 	select_type 	table 	type 	possible_keys 	key 	key_len 	ref 	rows 	Extra 
1	SIMPLE	pt_mails_journal	index	NULL	PRIMARY	4	NULL	89568
Т.е. получается при попадании первой записи не юзается ключ и поэтому тормоза.
Можно ли сделать так чтобы и первая запись была и не тормозило?
Другими словами, можно ли заставить использовать ключ ? (как то так)
 

dimagolov

Новичок
Автор оригинала: dimagolov
на InnoDB индекс юзается тоже вне зависимости от попадания первой записи
-~{}~ 05.07.10 16:13:

п.с. а версия MySQL какая?
http://dev.mysql.com/doc/refman/5.1/en/index-hints.html, хотя MyISAM это может и не помочь, кроме того:
Prior to MySQL 5.1.17, USE INDEX, IGNORE INDEX, and FORCE INDEX affect only which indexes are used when MySQL decides how to find rows in the table and how to process joins. They do not affect whether an index is used when resolving an ORDER BY or GROUP BY clause.
...
To influence index usage for sorting or grouping rows, use FOR ORDER BY or FOR GROUP BY.
 

mike

pmcoder
Спасибо помогло.
Поменял тип таблицы - все летает.
Пошел читать о InnoDB
 

prolis

Новичок
неужели тоже 0,3 сек?
[sql]
select * from (
SELECT *
FROM table
ORDER BY primary_key
LIMIT 50)
order by primary_key desc
[/sql]
 

prolis

Новичок
Автор оригинала: mike
prolis, ну и к чему ты написал свой запрос?
к тому, что "LIMIT 89520, 50" при 89570 записях - это непотребщина.
Попробуй мой запросик-то, он не больше 0,1 сек должен давать
 

dimagolov

Новичок
prolis, если это делается по индексу, то какая разница? и потом, судя по всему там скользящее окно, так что начало диапазона может быть разным.
 

mike

pmcoder
Запрос используется для вывода с постраничной разбивкой, т.е как раз со скользящим окном.
prolis, спасибо конечно за помощь, но в данном случае меня не интересовала производительность запроса в секундах, а разница в 2 порядка конкретно в моем случае.
Проблема решена, топик можно закрывать. Я думаю по поднятому вопросу тут есть исчерпывающий ответ.
 
Сверху