Сравнително добро заместване на "order by rand()" в MySQL

Метод 1

select @rand:=CEIL(MAX(uid)*RAND()) AS uid from tablica;select ddate,title,url,visits from tablica where uid>=@rand order by uid limit 10;

Метод 2

SELECT uid,ddate,title,url,visits  FROM tablica T JOIN (SELECT FLOOR(MAX(uid)*RAND()-1024) AS ID FROM tablica) AS x ON T.uid >= x.ID LIMIT 10;

Метод 3

SELECT uid,ddate,title,url,visits FROM tablica T JOIN (SELECT MAX(uid) AS ID FROM tablica) AS x ON T.uid >= FLOOR(x.ID*RAND()) LIMIT 10;

Метод 4

SELECT uid,ddate,title,url,visits FROM tablica t JOIN (SELECT(FLOOR(max(uid) * rand())) as maxid FROM tablica) as tt on t.uid >= tt.maxid LIMIT 10;

VN:F [1.9.22_1171]
Rating: 5.0/5 (1 vote cast)
VN:F [1.9.22_1171]
Rating: 0 (from 0 votes)
Сравнително добро заместване на "order by rand()" в MySQL, 5.0 out of 5 based on 1 rating

3 thoughts on “Сравнително добро заместване на "order by rand()" в MySQL”

  1. Има и 5ти метод с count(*) на таблицата и "LIMIT 1,".rand(0,$total-1); -- правят се толкова заявки колко реда ти трябват.

    VA:F [1.9.22_1171]
    Rating: 0.0/5 (0 votes cast)
    VA:F [1.9.22_1171]
    Rating: 0 (from 0 votes)
  2. Да адаша е прав за този пропуск и този метод работи.

    Междо другото го правих с count и е по- добре, но не ми допада метода на двете заявки. Преди доста години пробвах с count(*)(2 заявки) и се държеше МНОГО по- добре от order by rand()(с таблица от милиони редове), но така и не ми допадна идеята, че го правя с 2 заявки.

    PS: може и в една заявка да се вкара със subquery

    VN:F [1.9.22_1171]
    Rating: 0.0/5 (0 votes cast)
    VN:F [1.9.22_1171]
    Rating: 0 (from 0 votes)
  3. А производителнсота как е с тия варианти, защото определено като тежеста е в базата нещата не са много красиви. Според мен ако черната работа се остави на апликацията а не на базата положението ще е по приятно.

    VA:F [1.9.22_1171]
    Rating: 0.0/5 (0 votes cast)
    VA:F [1.9.22_1171]
    Rating: 0 (from 0 votes)

Вашият коментар

Вашият email адрес няма да бъде публикуван Задължителните полета са отбелязани с *