Въпреки че няма такова нещо като „бърза поръчка чрез rand()“, има заобиколно решение за вашата конкретна задача.
За получаване на произволен произволен ред , можете да направите като този немски блогър:http://web.archive.org/web/20200211210404/http://www.roberthartung.de/mysql-order-by-rand-a- case-study-of-alternatives/ (Не можах да видя URL адрес на гореща връзка. Ако някой види такъв, не се колебайте да редактира връзката.)
Текстът е на немски, но SQL кодът е малко по-надолу в страницата и в големи бели полета, така че не е трудно да се види.
Основно това, което той прави, е да направи процедура, която върши работата за получаване на валиден ред. Това генерира произволно число между 0 и max_id, опитайте да извлечете ред и ако не съществува, продължете, докато не уцелите такъв, който съществува. Той позволява извличане на x брой произволни редове, като ги съхранява във временна таблица, така че вероятно можете да пренапишете процедурата, за да бъде малко по-бърза, извличайки само един ред.
Недостатъкът на това е, че ако изтриете МНОГО редове и има огромни пропуски, шансовете са големи да пропусне много пъти, което ще го направи неефективен.
Актуализация:Различни времена за изпълнение
Може да е свързано с индексиране. id
е индексиран и бърз за достъп, докато добавянето на username
към резултата, означава, че трябва да прочете това от всеки ред и да го постави в таблицата с памет. С *
той също трябва да прочете всичко в паметта, но не е необходимо да прескача из файла с данни, което означава, че няма загубено време в търсене.
Това има значение само ако има колони с променлива дължина (varchar/text), което означава, че трябва да провери дължината, след което да пропусне тази дължина, вместо просто да прескочи зададена дължина (или 0) между всеки ред.