MySQL查询优化:连接查询排序限制(连接,按顺序,限制语句)
是这样的:现在有两个表,表和表的团队的人,每个人都属于一个团队,有人一场team_id。
给出了以下语句:
复制代码代码如下所示:
创建表t_team
(
主键,
Tname varchar(100)
);
创建表t_people
(
主键,
Pname varchar(100),
team_id int,
外键(team_id)参考t_team(ID)
);
接下来,我要连接两个表查询的前10人,并将他们分类的tname。
所以,一个SQL语句出生:SELECT * FROM t_people P左连接t_team T p.team_id = t.id阶10;{语句}
这是写SQL我第一反应,很容易理解的,也是大多数人的第一反应,然后测试语句的执行时间,要做的第一件事是准备数据。我使用存储过程来生成1000个数据表,在t_team在t_people表生成的数据(100000。存储过程在本文最后)
在其中执行SQL语句好几次,大约需要3秒。
然后更改两个语句进行比较:
1。的条款删除命令:SELECT * FROM t_people P左连接t_team T p.team_id = t.id;{ 2 }声明
忽略0秒。
2。仍然使用顺序,但删除连接t_team表:SELECT * FROM t_people p阶的p.pname极限10;{ 3 }声明
大约需要0.15秒。
人们发现该声明的效率很低。
为什么效率这么低{ } }和{声明(声明声明(声明} }执行速度非常快,{ 1 }声明仅仅是两者的结合。如果你先执行10人的结果进行排序,然后连接查询团队的每个人,而且效率不会这么低,那么只有一种解释:MySQL执行连接查询,然后整理一遍。
解决方法:如果你想提高效率,你需要修改SQL语句让MySQL第一10连接查询排序。
SQL语句:
SELECT * FROM(SELECT * FROM t_people p阶的p.pname极限10){ 4 }声明P左;
{ 4 }和{ }句句子的功能,虽然子查询,尽管他们似乎很尴尬,他们是更有效的,和它们的执行时间仅为0.16秒,这是20倍,高于此前的声明(耗时3秒)。
如果遇到复杂的表结构,这两个表的结构非常简单,我在实际开发中遇到了这样一个问题,它在{ }的方式中花费了80多秒,但是使用{语句}只需要1秒。
最后给出了数据制作的存储过程。
复制代码代码如下所示:
创建程序生成数据()
开始
声明int;
开始交易;
设置i=0;
当我1000岁时
插入t_team值(I + 1,concat(团队',我+ 1));
设置i = i + 1;
结束的时候;
设置i=0;
当我100000岁时
插入t_people值(I + 1,concat(人',我+ 1),我为1000 + 1);
设置i = i + 1;
结束的时候;
承诺;
结束