大家都知道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哪一个的时候建议返回字段的时候放在前面