MYSQL教程MySQL查询优化:连接查询排序浅谈
《MYSQL教程MySQL查询优化:连接查询排序浅谈》要点: MYSQL教程情况是这么一个情况:现在有两张表,team表和people表,每个people属于一个team,people中有个字段team_id. MYSQL教程 create table t_team ( id int primary key, tname varchar(100) ); MYSQL教程create table t_people 下面我要连接两张表查询出前10个people,按tname排序. MYSQL教程于是,一个SQL语句诞生了:select * from t_people p left join t_team t onp.team_id=t.id order by p.pname limit 10; [语句①] MYSQL教程 MYSQL教程然后来测试一下这个语句的执行时间. MYSQL教程首先要准备数据.我用存储过程在t_team表中生成1000条数据,在t_people表中生成100000条数据.(存储过程在本文最后) MYSQL教程执行上面那条SQL语句,执行了好几次,耗时在3秒左右. MYSQL教程再换两个语句对比一下:??? MYSQL教程1.把order by子句去掉:select * from t_people p left join t_team t on p.team_id=t.id limit10; [语句②] MYSQL教程耗时0.00秒,忽略不计. MYSQL教程2.还是使用order by,但是把连接t_team表去掉:select * from t_people p order by p.pname limit 10;? [语句③] MYSQL教程耗时0.15秒左右. MYSQL教程对比发现[语句①]的效率巨低. MYSQL教程为什么效率这么低呢.[语句②]和[语句③]执行都很快,[语句①]不过是二者的结合.如果先执行[语句③]得到排序好的10条people结果后,再连接查询出各个people的team,效率不会这么低.那么只有一个解释:MySQL先执行连接查询,再进行排序. MYSQL教程 MYSQL教程SQL语句: MYSQL教程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; [语句④] MYSQL教程 MYSQL教程这两个表的结构很简单,如果遇到复杂的表结构…我在实际开发中就碰到了这样的问题,使用[语句①]的方式耗时80多秒,但使用[语句④]只需1秒以内. MYSQL教程 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 MYSQL教程转载自:http://blog.csdn.net/xiao__gui/article/details/8616224 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- 刷新SQL Server所有视图、函数、存储过程
- Mysql必读Mysql5.7.14 linux版密码忘记完美解决办法
- sql中order by(true or false) 类似 group by 的方式
- Mysql入门获取缺失主键表信息的MYSQL语句
- Mysql应用mysql 月份查询该月有付款的数据
- python – pymssql.OperationalError:DB-Lib错误消息200
- Mysql应用安装mysql noinstall zip版
- Mysql应用MySQL server has gone away 问题的解决方法
- mysql – 为什么这些查询产生不同的结果?
- Java处理Oracle数据库小数点前面的0丢失问题