MySQL随机抽取数据的性能问题

2020-01-21  本文已影响0人  浥羽醉悠扬

在随机抽取数据,并且数据量超过1万的时候,这种写法效率太低。
写法1:

SELECT * FROM table_name ORDER BY RAND() LIMIT 5;

按目前各种论坛博客查到的资料,换成这种可以成倍的提升效率
写法2:

SELECT
    * 
FROM
    goods AS t1
    JOIN (
SELECT
    ROUND(
    RAND( ) * ( ( SELECT MAX( goods_id ) FROM `goods` ) - ( SELECT MIN( goods_id ) FROM `goods` ) ) + ( SELECT MIN( goods_id ) FROM `goods` ) 
    ) AS id 
    ) AS t2 
WHERE
    t1.goods_id >= t2.id 
ORDER BY
    t1.goods_id 
    LIMIT 5;

就实际操作来说:

1.当数据量小于1万时,写法1与写法2在效率上没有差异。
2.当数据量大到一定程度时,写法1的性能会迅速下降。40万订单数据,随机抽取5条耗时11s。同样条件下,写法2耗费时间0.03s。
3.写法2不适用于经过一定规则生成的id为主键的表,而且取出的数据是连续的,所以只能一次查询一条。但是效率上依旧完胜于写法1。

上一篇 下一篇

猜你喜欢

热点阅读