• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • MsSql
  • Mysql
  • oracle
  • MariaDB
  • DB2
  • SQLite
  • PostgreSQL
  • MongoDB
  • Redis
  • Access
  • 数据库其它
  • sybase
  • HBase
您的位置:首页 > 数据库 >Mysql > MySQL查询优化:连接查询排序浅谈

MySQL查询优化:连接查询排序浅谈

作者: 字体:[增加 减小] 来源:互联网 时间:2017-05-11

通过本文主要向大家介绍了mysql 排序优化,mysql数据库的优化,mysql的sql优化,mysql服务器的优化,mysql高性能优化等相关知识,希望本文的分享对您有所帮助

情况是这么一个情况:现在有两张表,team表和people表,每个people属于一个team,people中有个字段team_id。


下面给出建表语句:

create table t_people
(
id int primary key,
pname varchar(100),
team_id int,
foreign key (team_id) references t_team(id)
);
</div>
下面我要连接两张表查询出前10个people,按tname排序。

于是,一个SQL语句诞生了:select * from t_people p left join t_team t onp.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秒左右,比之前的[语句①]提高了20倍。

这两个表的结构很简单,如果遇到复杂的表结构…我在实际开发中就碰到了这样的问题,使用[语句①]的方式耗时80多秒,但使用[语句④]只需1秒以内。


最后给出造数据的存储过程:

转载自:http://blog.csdn.net/xiao__gui/article/details/8616224

</div>
分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • MySQL查询优化:连接查询排序浅谈

相关文章

  • 2018-12-05mysql操作sql的小技巧的详情介绍
  • 2018-12-05MySQL学习之Java连接MySQL数据库的图文代码实例
  • 2017-05-11MySQL数据类型varchar详解
  • 2018-12-05mysql数据分组:创建分组
  • 2018-12-05MySQL中的基础知识
  • 2017-05-11MySQL笔记之数据备份与还原的使用详解
  • 2018-12-05详解MySQL根(Root)密码在Linux(CentOS)下如何重置(图文)
  • 2018-12-05mysql字符集和数据库引擎修改方法分享
  • 2018-12-05MySQL数据库远程连接开启方法
  • 2018-12-05mysql odbc字符集设置(中文显示乱码)

文章分类

  • MsSql
  • Mysql
  • oracle
  • MariaDB
  • DB2
  • SQLite
  • PostgreSQL
  • MongoDB
  • Redis
  • Access
  • 数据库其它
  • sybase
  • HBase

最近更新的内容

    • MySQL中修改表结构时需要注意的一些地方
    • Mysql 安全注意事项
    • MySQL OOM 系列三 摆脱MySQL被Kill的厄运_MySQL
    • Mysql常见问题集锦
    • mysql 表的增删改
    • oracle SCN跟TIMESTAMP之间转换
    • MySql存储过程异常处理示例代码分享
    • mssql转换mysql的方法小结
    • MYSQL 浅谈MyISAM 存储引擎
    • 关于启动方式的10篇文章推荐

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有