mysql> select count(1) from sys_log;
+----------+
| count(1) |
+----------+
|    69177 |
+----------+


//获取十条随机数据
select * from sys_log order by RAND() limit 10;
10 rows in set (1.47 sec)


当数据表内容过多的时候上面的查询会比较耗时,可以进一步优化

select a.* from sys_log a   inner join(select id from sys_log order by RAND() limit 10) b on a.id=b.id;
10 rows in set (0.34 sec)

有些人可能会错把 inner join 写成 left join ,这两者的执行效率是有区别的

select a.* from sys_log a   left join(select id from sys_log order by RAND() limit 10) b on a.id=b.id;
10 rows in set (2.58 sec)

left join在任何场景下都不会比inner join的执行效率高 因为left join除了需要所有inner join的结果集以外还需要左表的所有没有关联上的数据。
left join除了要求关联字段有索引以外,最好将小表作为左表,因为检索的循环次数更少,前提是你的业务逻辑没问题,因为不同的写法逻辑是不一样的

02-24 16:02