在随机抽取数据,并且数据量超过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。
网友评论