parser

Написать ответ на текущее сообщение

 

 
   команды управления поиском

MYSQL. Возвращаясь к ...ORDER BY RAND() LIMIT 1...

Misha v.3 02.10.2002 17:36

Может кому потребуется...

Сегодня мне потребовалось делать ЭТО с достаточно большой таблицей (~60000 записей, pk)

Собственно помня, что в доке по MySQL дается такая инормация (да и на форуме это не раз упоминалось):
This is useful to get a random sample of a set SELECT * FROM table1,table2 WHERE a=b AND c<d ORDER BY RAND() LIMIT 1000
я не долго думая написал аналогично. КакогО же было мое удивление, когда запрос выполнялся несколько секунд...

explain показал:
| table | ALL | 60236 | Using temporary; Using filesort |
Переписал так:
$cnt(^int:sql{SELECT CEILING(RAND()*COUNT(*)) FROM table}[$.default{0}])
$rec[^table::sql{SELECT field_list FROM table}[$.offset($cnt)$.limit(1)]]
explain стал показывать, что будут использоваться индексы и все залетало...

Начал читать более внимательно доку по MySQL:
You can't use a column with RAND() values in an ORDER BY clause, because ORDER BY would evaluate the column multiple times. In MySQL Version 3.23, you can, however, do: SELECT * FROM table_name ORDER BY RAND()
Так-же нашел упоминание об ALTER TABLE ... ORDER BY col1, col2... которое раньше почему-то упустил (это стОит делать после изменений в табличке если в основном данные достаются из нее, и обычно сортируются именно в этом порядке)

В общем век живи - век учись, все равно дураком помрешь...