Сравнително добро заместване на „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;

Категория:

3 отговора

  1. Аватарът на Марто

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

  2. Аватарът на Мартин Петров

    Да адаша е прав за този пропуск и този метод работи.

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

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

  3. Аватарът на Neo2SHYAlien

    А производителнсота как е с тия варианти, защото определено като тежеста е в базата нещата не са много красиви. Според мен ако черната работа се остави на апликацията а не на базата положението ще е по приятно.

Logged in as {{omniform_current_user_display_name}}. Edit your profile. Log out? Required fields are marked *

Your email address will not be published. Required fields are marked *

Comments are closed.

You must be logged in to post a comment.