mysql优化之数据库随机取一条数据
2017-10-13 10:47
309 查看
大家都知道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哪一个的时候建议返回字段的时候放在前面
其实这个方法是超级鸡肋的,当然你爱好也无所谓,首先列举两个表
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哪一个的时候建议返回字段的时候放在前面
相关文章推荐
- MySql 100万级别数据中随机获取一条或多条记录之RAND()优化
- mysql查找数据库重复数据,保留其中一条
- MySql实现随机获取表中的一条数据
- MySQL性能优化(特别是最后保证随机查到数据的思想,而不是前几条)
- SQL语句select随机调取10行数据 Access/SQL Server/Mysql等数据库
- 随机获取Mysql数据表的一条或多条记录
- MYSQL随机抽取数据库里的几条数据
- MySQL随机取一条数据 取指定条数的数据
- 随机获取Mysql数据表的一条或多条记录
- mysql优化取随机数据慢的方法
- mysql随机取3条数据以及优化
- MySQL随机抽取一条数据
- mysql随机查询出一条 符合条件的数据
- Mysql 大数据量高并发的数据库优化
- 随机获取Mysql数据表的一条或多条记录
- oracle随机读取一条数据以及excle导入数据库
- Mysql 大数据量高并发的数据库优化
- 随机获得Mysql数据表的一条或多条记录
- MSSQL、MySQL 数据库删除大批量千万级百万级数据的优化
- 随机获取Mysql数据表的一条或多条记录