MySQL 必知必会
朱晓峰
前摩根大通银行技术部副总裁、系统架构师
17746 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 36 讲
MySQL 必知必会
15
15
1.0x
00:00/00:00
登录|注册

24 | 查询有点慢,语句该如何写?

你好,我是朱晓峰。这节课,我想和你聊一聊怎么对查询语句进行调优。
你肯定遇到过这样的情况:你写的 SQL 语句执行起来特别慢,要等好久才出结果,或者是干脆就“死”在那里,一点反应也没有。一旦遇到这种问题,你就要考虑进行优化了。
如果你开发过数据库应用,肯定会有这样的体会:让应用运行起来不难,但是要运行得又快又好,就没那么不容易了。这很考验我们的内功。
而要想提高应用的运行效率,你就必须掌握优化查询的方法。今天,我就给你讲一下 MySQL 的查询分析语句和 2 种优化查询的方法。

查询分析语句

虽然 MySQL 的查询分析语句并不能直接优化查询,但是却可以帮助你了解 SQL 语句的执行计划,有助于你分析查询效率低下的原因,进而有针对性地进行优化。查询分析语句的语法结构是:
{ EXPLAIN | DESCRIBE | DESC }查询语句;
下面我借助一个小例子,给你详细地讲解一下,怎么使用查询分析语句,来分析一个查询的执行计划。
假设有一个销售流水表(demo.trans),里面有 400 万条数据,如下所示:
现在,我要查询一下商品编号是 1 的商品,在 2020 年 6 月 18 日上午 9 点到 12 点之间的销售明细。代码如下所示:
mysql> SELECT itemnumber,quantity,price,transdate
-> FROM demo.trans
-> WHERE itemnumber=1
-> AND transdate>'2020-06-18 09:00:00'
-> AND transdate<'2020-06-18 12:00:00';
+------------+----------+-------+---------------------+
| itemnumber | quantity | price | transdate |
+------------+----------+-------+---------------------+
| 1 | 0.276 | 70.00 | 2020-06-18 11:04:00 |
| 1 | 1.404 | 70.00 | 2020-06-18 11:10:57 |
| 1 | 0.554 | 70.00 | 2020-06-18 11:18:12 |
| 1 | 0.431 | 70.00 | 2020-06-18 11:27:39 |
| 1 | 0.446 | 70.00 | 2020-06-18 11:42:08 |
| 1 | 0.510 | 70.00 | 2020-06-18 11:56:43 |
+------------+----------+-------+---------------------+
6 rows in set (6.54 sec)
结果显示,有 6 条记录符合条件。这个简单的查询一共花去了 6.54 秒,这个速度显然太慢了。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

本文详细介绍了如何通过查询分析语句来优化数据库查询,提高应用的运行效率。作者首先介绍了MySQL的查询分析语句,并通过实例演示了如何分析查询执行计划,以及如何理解查询分析语句结果集中各个字段的含义。接着,文章分享了针对查询速度慢的原因进行优化的方法,包括创建索引来提高查询速度。最后,通过对优化后的查询进行分析,展示了优化措施的有效性。整篇文章通过实例详细讲解了查询语句优化的方法和步骤,对读者解决查询语句执行缓慢的问题具有指导意义。通过本文,读者可以快速了解如何利用查询分析语句和优化方法来提高数据库查询效率,为实际应用提供了有益的技术指导。文章还提到了在使用关键字“LIKE”和“OR”时,如何利用索引提高查询效率的方法,以及关于子查询执行效率的问题。整体而言,本文内容丰富,实例详实,对读者解决数据库查询优化问题具有重要参考价值。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《MySQL 必知必会》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(6)

  • 最新
  • 精选
  • 朱晓峰
    置顶
    你好,我是朱晓峰,下面我就来公布一下上节课思考题的答案: 上节课,我们学习了ER模型。下面是思考题的答案: 实体: 1. 门店 2. 员工 3. 仓库 4. 商品 1对多的关系: 1. 门店与仓库的拥有关系 2. 门店与员工的雇佣关系 多对对的关系: 1. 仓库和商品的库存关系 2. 员工、仓库和商品的盘点关系 属性 门店:编号、名称、地址、电话、联系人 员工:编号、名称、工号、身份证、电话、地址 仓库:编号、名称 商品:编号、条码、名称、售价、规格、单位 库存关系:库存数量 盘点关系:盘存数量、结存数量、盈亏数量
    2021-05-20
    3
  • giteebravo
    以前查看执行计划只知道使用 explain 今次知道了 describe 语句也能达到同样效果! 此外,还学习了在使用关键字 LIKE 和 OR 的情况下,用索引来提高查询效率的具体方法。 最后有两个疑问: 1. 任何时候子查询的执行效率都不如连接查询吗?那么子查询的出现,是为了解决什么样的问题呢? 2. 对于特别复杂的查询,尤其动辄使用临时表去实现一些报表查询的需求时,该怎么去分析其查询语句呢?

    作者回复: 子查询可以解决一些复杂的查询问题。遇到特别复杂的查询,需要用临时表通过多个步骤最终得到结果的场景,可以通过分析每个步骤的查询语句,还有临时表的数据量,来决定优化策略

    2021-05-08
    2
  • 代方洋
    mysql的优化器是基于什么决定执行计划的?如果一个表有一个索引,查询语句只查这个字段where条件中是这个字段like '%hh'这样也不走索引吗? 例如:表 Tab 有存在索引idx1:col。执行 select col from Tab where col like '%hh';这样也不走索引吗? 我觉得在快速索性全扫描会比全表扫描更快啊。

    作者回复: 索引的目的,是快速定位记录,如果无法快速定位,索引就失去了意义,因为需要回表,不如直接遍历。

    2021-07-09
    1
  • SharpBB
    select * from demo.trans t1 left join demo.goodsmaster t2 on t1.itemnumber=t2.itemnumber where t2.goodsname like '%书%';

    作者回复: 请参考思考题答案

    2022-02-15
  • 沈康
    select a.* from demo.trans a,demo.goodsmaster b where a.itemnumber=b.itemnumber and b.goodsname LIKE '%书%';

    作者回复: 请参考思考题答案

    2021-05-22
  • floating
    课后思考题: SELECT * FROM demo.trans t join demo.goods g on t.itemnumber = g.itemnumber WHERE goodsname LIKE '%书%';

    作者回复: 请参考思考题答案

    2021-05-13
收起评论
显示
设置
留言
6
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部