MySQL查询优化:连接查询排序limit(join、order by、limit语句)
来源:互联网 发布:网站推广软件三尾狐 编辑:程序博客网 时间:2024/05/18 22:45
不知道有没有人碰到过这样恶心的问题:两张表连接查询并limit,SQL效率很高,但是加上order by以后,语句的执行时间变的巨长,效率巨低。
情况是这么一个情况:现在有两张表,team表和people表,每个people属于一个team,people中有个字段team_id。
下面给出建表语句:
- create table t_team
- (
- id int primary key,
- tname varchar(100)
- );
- create table t_people
- (
- id int primary key,
- pname varchar(100),
- team_id int,
- foreign key (team_id) references t_team(id)
- );
下面我要连接两张表查询出前10个people,按tname排序。
于是,一个SQL语句诞生了:select * from t_people p left join t_team t on p.team_id=t.id order by p.pname limit 10; [语句①]
这个是我第一反应写的SQL,通俗易懂,也是大多数人的第一反应。然后来测试一下这个语句的执行时间。首先要准备数据。我用存储过程在t_team表中生成1000条数据,在t_people表中生成100000条数据。(存储过程在本文最后)
执行上面那条SQL语句,执行了好几次,耗时在3秒左右。
再换两个语句对比一下:
1.把order by子句去掉:select * from t_people p left join t_team t on p.team_id=t.id limit10; [语句②]
耗时0.00秒,忽略不计。
2.还是使用order by,但是把连接t_team表去掉:select * from t_people p order by p.pname limit 10; [语句③]
耗时0.15秒左右。
对比发现[语句①]的效率巨低。
为什么效率这么低呢。[语句②]和[语句③]执行都很快,[语句①]不过是二者的结合。如果先执行[语句③]得到排序好的10条people结果后,再连接查询出各个people的team,效率不会这么低。那么只有一个解释:MySQL先执行连接查询,再进行排序。
解决方法:如果想提高效率,就要修改SQL语句,让MySQL先排序取前10条再连接查询。
SQL语句:
select * from (select * from t_people p order by p.pname limit 10) p left join t_team t on p.team_id=t.id limit 10; [语句④]
[语句④]和[语句①]功能一样,虽然有子查询,虽然看起来很别扭,但是效率提高了很多,它的执行时间只要0.16秒左右,比之前的[语句①] (耗时3秒) 提高了20倍。
这两个表的结构很简单,如果遇到复杂的表结构…我在实际开发中就碰到了这样的问题,使用[语句①]的方式耗时80多秒,但使用[语句④]只需1秒以内。
最后给出造数据的存储过程:
- CREATE PROCEDURE createdata()
- BEGIN
- DECLARE i INT;
- START TRANSACTION;
- SET i=0;
- WHILE i<1000 DO
- INSERT INTO t_team VALUES(i+1,CONCAT('team',i+1));
- SET i=i+1;
- END WHILE;
- SET i=0;
- WHILE i<100000 DO
- INSERT INTO t_people VALUES(i+1,CONCAT('people',i+1),i%1000+1);
- SET i=i+1;
- END WHILE;
- COMMIT;
- END
作者:叉叉哥 转载请注明出处:http://blog.csdn.net/xiao__gui/article/details/8616224
- MySQL查询优化:连接查询排序limit(join、order by、limit语句)
- MySQL查询优化:连接查询排序limit(join、order by、limit语句)
- MySQL查询优化:连接查询排序limit(join、order by、limit语句)
- MySQL联合查询,order by与LIMIT
- mysql order by limit slow 慢查询
- MySQL limit查询优化
- mysql limit查询优化
- mysql limit查询优化
- mysql limit查询优化
- mysql limit查询优化
- mysql limit查询优化
- MYSQL查询优化:Limit
- MYSQL查询优化:Limit
- MYSQL查询优化:Limit
- MySQL limit 查询优化
- MYSQL查询优化:Limit
- mysql limit查询优化
- mysql limit查询语句优化原则
- PHP 下 CURL 通过 POST 提交表单失败的原因及解决方法
- jquery返回前、后一个相邻的节点
- innerHTML中的js运行
- cin流输入控制(clear(),sync(),flush(),ignore())
- 如何提高效率
- MySQL查询优化:连接查询排序limit(join、order by、limit语句)
- 工欲善其事必先利其器——第三弹用云存储实现对云计算的监控
- Win8下Visual Studio编译报“无法注册程序集***dll- 拒绝访问。请确保您正在以管理员身份运行应用程序。对注册表项”***“的访问被拒绝。”问题修正
- Ajax + JQuery + JSON + Struts使用例子
- 根据IP定位用户所在城市信息
- 佛山市二零零网络科技有限公司骗子公司 垃圾公司 www.200.net
- 暴力视音频分类检测相关论文
- 工欲善其事必先利其器——第二弹HDFS性能压测工具浅析
- 12个Flex常用功能代码