Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > MySQL > оптимизация order by...


Автор: sergey_85 5.1.2012, 08:43
Привет!

Как можно оптимизирвать этот запрос, очееень долго выполняется

Код

select SQL_CALC_FOUND_ROWS * from tbl_stellbeton  
order by tbl_stellbeton.price asc limit 0, 100



хотя этот за пару секунд

Код

select SQL_CALC_FOUND_ROWS * from tbl_stellbeton  
order by tbl_stellbeton.id asc limit 0, 100


id - primary index asc
price - index asc

Автор: Akina 5.1.2012, 20:24
explain запросов дайте...

Автор: sergey_85 9.1.2012, 02:15

Код


 select SQL_CALC_FOUND_ROWS *
 from tbl_stellbeton  
 order by tbl_stellbeton.id asc limit 0, 100

id,select_type,table,type,possible_keys,key,key_len,ref,rows,Extra
1,SIMPLE,tbl_stellbeton,index,NULL,PRIMARY,4,NULL,97005,



Код

 select SQL_CALC_FOUND_ROWS *
 from tbl_stellbeton  
 order by tbl_stellbeton.price asc limit 0, 100

id,select_type,table,type,possible_keys,key,key_len,ref,rows,Extra
1,SIMPLE,tbl_stellbeton,ALL,NULL,NULL,NULL,NULL,97005,"Using filesort"


Автор: Goganchic 9.1.2012, 07:52
рискну предположить что у вас слишком много строк (более 50%) с одинаковой ценой, поэтому индекс получается низкоселективный и поэтому MySQL его не использует, из-за чего случается filesort, который приводит к тормозам

Автор: Akina 9.1.2012, 21:50
Один запрос выбирает по индексу, а второй прямым просмотром... стОит ли удивляться разнице во времени?

Автор: sergey_85 10.1.2012, 02:10
есть предложения как побороть?

Автор: Akina 10.1.2012, 07:33
Создать необходимый индекс.

Автор: Zloxa 10.1.2012, 11:45
индекс, я так понял уже есть, его надо просто http://dev.mysql.com/doc/refman/5.1/en/index-hints.html.

Автор: sergey_85 13.1.2012, 05:46
да есть у меня индексы и были они ....

'tbl_stellbeton', '0', 'PRIMARY', '1', 'id', 'A', '102939', NULL, NULL, '', 'BTREE', '', ''
'tbl_stellbeton', '1', 'idx_price', '1', 'price', 'A', '102939', NULL, NULL, 'YES', 'BTREE', '', ''


еще таже самая проблема с where

долго
Код

select SQL_CALC_FOUND_ROWS * from tbl_stellbeton 
where price>1000  limit 0, 100


быстро
Код

select SQL_CALC_FOUND_ROWS * from tbl_stellbeton 
where id>1000  limit 0, 100


ps: mysql version - '5.5.13'
данных в таблице ОЧЕНЬ много!

Автор: Zloxa 13.1.2012, 08:40
Цитата(sergey_85 @  13.1.2012,  05:46 Найти цитируемый пост)
да есть у меня индексы

индексы мало есть. Их надо еще использовать. Хинт прописывать пробовали?

Автор: sergey_85 14.1.2012, 05:58
Цитата(Zloxa @ 13.1.2012,  08:40)
Цитата(sergey_85 @  13.1.2012,  05:46 Найти цитируемый пост)
да есть у меня индексы

индексы мало есть. Их надо еще использовать. Хинт прописывать пробовали?

разве оптимизатор сам не определяет где и как исп. индексы...

Автор: Zloxa 14.1.2012, 07:47
Goganchic выдвинул вполне правдоподобную версию почему оптимизатор этого не делает.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)