mysql优化之数据库随机取一条数据

版权声明:本文为博主原创文章,转载请注明文章来源,尊重知识,分享别人标识作者是一种美德 https://blog.csdn.net/u010757785/article/details/78223271

大家都知道mysql 查询数据库随机取一条数据当然用rand()方法 

其实这个方法是超级鸡肋的,当然你爱好也无所谓,首先列举两个表

a表   id(主键 int),cardnumber(身份证号码 char(18)),name(用户名 varchar(40))

b表   id(a表对应id int), tags(标签 varchar(11)),tagsnumber(标签编码,varchar(24))


现在打比方这a表有一万表数据 ,对应的b表有1万+数据

不要在乎表这里只是举例

现在查询a表随机一个用户

1:select * from a order by rand() limit 1(肯定初步大家刚出来的都会想到这个方法)

可是这样靠谱吗,反正我觉得不靠谱  上面说了一万条数据怎么也得接近20秒吧返回一条数据

首先说说rand()他是把表数据首先整个取出来,排序,就算你limit有用吗

2:select * from a limit 5    

在代码随机取出一条

这种也不是怎么好,

3:我看别人说max和min结合用,反正我觉得不靠谱,反正我尝试了一下基本也差不多要5秒左右,查询复杂一点,对于那种一条sql几乎有20几行的那真是要你疯癫起来


4:结合程序+order by

首先数字字段+索引来实现

$orderby=array('order by id asc','order by id desc','order by cardnumber asc','order by cardnumber desc');

$sql="select * from a ".$orderby[array_rand($orderby,1)]. " limit 1 ";


虽然不能完全随机,但是还是满足日常需求

说道这个其实也可以讨论一下order by性能丢失,有时候你会发现没用order by和用了order by居然性能丢失,当然我说的是没有索引字段的情况下

例如假设上面表是一对一的关系 获取用户下面一个标签

select b.*,a.* from b inner join b on a.id=b.id order by a.uid asc limit 1

你会发现如果是b.uid会快一点,所以当你order by哪一个的时候建议返回字段的时候放在前面




猜你喜欢

转载自blog.csdn.net/u010757785/article/details/78223271