眾所周知,在MySQL中,如果直接 ORDER BY RAND() 的話,效率非常差,因為會多次執行。事實上,如果等值查詢也是用 RAND() 的話也如此,我們先來看看下面這幾個SQL的不同執行計劃和執行耗時。
首先,看下建表DDL,這是一個沒有顯式自增主鍵的InnoDB表:
1、常量等值檢索:
可以看到執行計劃很不錯,是常量等值查詢,速度非常快。
2、使用RAND()函數乘以常量,求得隨機數后檢索:
可以看到執行計劃很糟糕,雖然是只掃描索引,但是做了全索引掃描,效率非常差。因為WHERE條件中包含了RAND(),使得MySQL把它當做變量來處理,無法用常量等值的方式查詢,效率很低。
我們把常量改成取t_innodb_random表的最大id值,再乘以RAND()求得隨機數后檢索看看什么情況: