本文链接:https://blog.csdn.net/xiao__gui/article/details/8616224

不知道有没有人碰到过这样恶心的问题:两张表连接查询并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

————————————————

版权声明:本文为CSDN博主「叉叉哥」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。

原文链接:https://blog.csdn.net/xiao__gui/article/details/8616224

mysql join 排序_MySQL查询优化:连接查询排序limit(join、order by、limit语句)相关推荐

  1. SQL数据库语言基础之SqlServer多表连接查询与INNER JOIN内连接查询

    文章目录 一.简单连接查询 二.多表连接查询 三.INNER JOIN 内连接查询 一.简单连接查询 1.直接连接:无连接规则连接两表,得到的是两个表的笛卡尔积. 连接后的行数=表1行数*表2行数 连 ...

  2. left join 一对多_MYSQL 连接查询算法:JOIN语句在 MYSQL 内部到底是怎么执行的

    前言 我们从一个问题引入今天的主题. 在日常业务开发中,我们可能经常听到 DBA 对我们说"不要"(注意:不是禁止)使用 join,那么为什么 DBA 对 join 这么抵触呢?是 ...

  3. mysql 子查询 排序_MySQL的子查询中排序

    起因 有一张表保存着用户对于文件的阅读记录, 包括文件名, 读者, 阅读时间, 时长, 备注评论. create table reading_record ( id int primary key a ...

  4. mysql join on 索引_连接查询,表关联查询join on,索引,触发器,视图

    一.连接查询 1.统计每一个部门的人数  "部门名,部门的人数" select department,count(eid) from employee group by depar ...

  5. mysql 连接查询索引_Mysql (四)连接查询和索引

    一.什么是连接查询:就是将二个或二个以上的表,"连接起来"当做一个数据源,并从中去取得所须要的数据.连接查询包括交叉连接查询.内连接查询.外连接查询 (一)交叉连接:交叉连接不带W ...

  6. mysql 三个表内连接查询_MySQL多表查询详解

    多表查询 1. 表与表之间的关系 <1> 一对一 用户表和身份信息表,用户表是主表 男人表.女人表 create table man( mid int primary key auto_i ...

  7. mysql in 有序_mysql中的in排序 mysql按in中顺序来排序

    假设,有如下的sql语句: 复制代码 代码示例: select * from table where id IN (3,6,9,1,2,5,8,7); 这样的情况取出来后,其实,id还是按1,2,3, ...

  8. 小白 MySQL数据库链接查询语句_MySQL数据库——连接查询

    今天将用 "手" 来教大家关于MySQL连接查询的知识! ============================================================= ...

  9. mysql按字段值排序_mysql按字段值排序

    1.mysql按字段值的拼音首字母排序 关键词binary :SELECT name FROM topic ORDER BYbinary name asc 2.php获取汉字拼音的第一个字母 直接调用 ...

最新文章

  1. Intel Code Challenge Elimination Round (Div.1 + Div.2, combined) B. Verse Pattern 水题
  2. 1957模拟计算机,统考计算机作业
  3. JUC原子类-框架(一)
  4. mysql数据结构优化,范式和反范式
  5. 各种优秀依赖库,大赞
  6. Git 在团队中的最佳实践--如何正确使用Git Flow
  7. JMS 2.0中JMSContext的类型
  8. 上海梵科信息科技有限公司
  9. python 求子字符串_(6)KMP算法(求子串的位置)______字符串的匹配
  10. 【Kafka】Kafka创建Topic的时候提示WARNING: Due to limitations in metric names, topics with a period ('.')
  11. html有定位页面长度,html – 如何让div / span“填写”页面的剩余宽度/高度,并保持固定位置?...
  12. Frameset使用教程
  13. [.net 面向对象编程基础] (22) 事件
  14. 心算技巧 —— 大数的三次方根
  15. 智能优化算法:粒子群算法相关代码
  16. 回顾RHCE——邮件收发实验
  17. 2004-2020历年美赛优秀论文资源
  18. ubuntu20.04 LTS安装谷歌拼音输入法
  19. 企业研发人员配备比例_中小IT企业项目团队人员配置管理
  20. 智慧城市网络安全建设框架及实践

热门文章

  1. python之路-操作系统
  2. 爬虫入门【10】Pyspider框架简介及安装说明
  3. Python爬虫(十二)_XPath与lxml类库
  4. 从0开始搭建SQL Server AlwaysOn 第一篇(配置域控)
  5. dwz框架---(2)表单回调函数
  6. 分析:微软最终将赢得平板电脑市场的5个理由
  7. 目标检测voc转coco改良版
  8. cmake常用语法参考
  9. gravatar配置和使用【让你的网站使用全球通用头像】
  10. Spark机器学习之协同过滤算法