文章目录

  • 一、考点
    • 1、查找分析查询速度慢的原因
      • 1)分析SQL查询慢的方法
      • 2)使用 show profile
      • 3)使用 show status
      • 4)使用 show processlist
      • 5)使用 explain
    • 2、优化查询过程中的数据访问
      • 1)访问数据太多导致性能下降
      • 2)确定应用程序是否在检索大量超过需要的数据,可能是太多行或列
      • 3)确认 MySQL服务器是否在分析大量不必要的数据行
      • 4)避免使用如下SQL语句
      • 5)重复查询相同的数据,可以缓存数据,下次直接读取缓存
      • 6)是否在扫描额外的记录
    • 3、优化长难的查询语句
      • 一个复杂查询好 还是 过个 简单查询好???
      • 1)切分查询
      • 2)分解关联查询
    • 4、优化特定类型的查询语句
      • 1)优化 count() 查询
      • 2)优化关联查询
      • 3)优化子查询(即嵌套查询)
      • 4)优化 GROUP BY 和 DISTINCT
      • 5)优化 LIMIT 分页
        • 解决方法:
      • 6)优化 UNION 查询
  • 二、解题方法
  • 三、真题
    • SQL语句优化的一些方法。
      • 注:此题可以根据以上的内容进行一个详细的总结。

一、考点

1、查找分析查询速度慢的原因

1)分析SQL查询慢的方法

  • 记录 慢查询日志
  • 分析查询日志,不要直接打开慢查询日志进行分析,这样比较浪费时间和精力,可以使用 pt-query-digest工具 进行分析。

2)使用 show profile

  • set profiling = 1; 开启,服务器上执行的所有语句会检测消耗的时间,存到临时表中。
  • show profiles;
  • show profile for query 临时表ID;

3)使用 show status

  • show status 会返回一些计数器, show global status 查看服务器级别的所有计数;
  • 有时根据这些计数,可以猜测出哪些操作代价较高或者消耗时间多。

4)使用 show processlist

  • 观察是否有大量线程处于不正常的状态或者特征。

5)使用 explain

  • 分析单条SQL语句。

2、优化查询过程中的数据访问

1)访问数据太多导致性能下降

不要使用 SELECT *

2)确定应用程序是否在检索大量超过需要的数据,可能是太多行或列

如:一个应用程序在某个步骤下,只需要获取到 10列中的两列的50条数据,但是在查询的时候,特别贪婪的把所有的数据所有列的内容全部都查询了出来,这样本身就是不合理的,所以我们要确定该情况是否存在。

3)确认 MySQL服务器是否在分析大量不必要的数据行

4)避免使用如下SQL语句

  • 查询不需要的记录,使用 limit 解决;
  • 多表关联返回全部列,指定 A.id, A.name, B.age
  • 总是取出全部列,SELECT * 会让优化器无法完成索引覆盖扫描的优化。

5)重复查询相同的数据,可以缓存数据,下次直接读取缓存

6)是否在扫描额外的记录

使用 explain 来进行分析,如果发现查询需要扫描大量的数据,但只返回少数的行,可以通过如下技巧去优化:

  • 使用索引覆盖扫描,把所有用的列都放到索引中,这样存储引擎不需要回表获取对应行,就可以返回结果;
  • 改变数据库和表的结构,修改数据表范式;
  • 重写SQL语句,让优化器可以以更优的方式执行查询

3、优化长难的查询语句

一个复杂查询好 还是 过个 简单查询好???

  • MySQL内部每秒能扫描内存中上百万行数据,相比之下,响应数据给客户端就要慢很多;
  • 使用尽可能少的查询是好的,但是有时将一个大的查询分解为多个小的查询是很有必要的。

1)切分查询

  • 将一个大的查询分为多个小的相同的查询;
  • 一次性删除 1000万 的数据要比一次删除1万,暂停一会的方案更加损耗服务器开销。

2)分解关联查询

  • 可以将一条关联语句分解成多条SQL来执行;
  • 让缓存的效率更高;
  • 执行单个查询可以减少锁的竞争;
  • 查询效率会有大幅提升;
  • 较少冗余记录的查询。

4、优化特定类型的查询语句

1)优化 count() 查询

  • count(*) 中的 * 会忽略所有的列,直接统计所有列数,因此不要使用 count(列名)
  • MyISAM中,没有任何 WHERE 条件的 count(*) 会非常快;
  • 当有 WHERE 条件,MyISAM的 count统计不一定比其他引擎快
    • 可以使用 explain进行全表扫描,查询近似值,用近似值替代 count(*)
    • 增加汇总表(每次修改信息就修改一下汇总表);
    • 使用缓存(每次查询的时候,查询汇总表即可,可以把汇总表做成缓存);

2)优化关联查询

  • 确定 ON 或者 USING 子句的列上是否有索引(如果没有,则一定要建立索引,没有索引会导致全表扫描,对查询的效率);
  • 确保 GROUP BYORDER BY 中只有一个表中的列,这样 MySQL 才有可能使用索引。

3)优化子查询(即嵌套查询)

尽可能使用关联查询来替代。

4)优化 GROUP BY 和 DISTINCT

这两种查询均可使用 索引 来优化,是 最有效的优化方法.

  • 关联查询中,使用 标识列 进行分组的效率会更高(即 使用 GROUP BY 的时候,尽量使用 主键列,或者是 auto_increment 这样的列来做分组,效率会更高);
  • 如果不需要 ORDER BY,进行 GROUP BY 时使用 ORDER BY NULL ,MySQL不会再进行文件排序(否则有可能进行文件排序,导致性能消耗);
  • WITH ROLLUP 超级聚合,可以挪到应用程序处理。

5)优化 LIMIT 分页

LIMIT 偏移量大的时候,查询效率较低.

解决方法:

可以记录上次查询的 最大ID,下次查询时直接根据该ID来查询(如: limit 0,100,加个 where条件 ,where id > '上次查询的最大ID',虽然这样的值并不一定很精确,但是我们可以用其他的方法,进行数据上的弥补)。

6)优化 UNION 查询

UNION ALL的效率高于 UNION(用 UNION ALL 来优化 UNIONUNION ALL 会将重复的数据显示出来,可以在应用层面把重复的数据筛掉,但是我们查询的时候,还使用 UNION ALL, 对MySQL的性能损耗会降低很多,提高我们的查询效率)。

二、解题方法

对于此类考题,先说明如何定位低效SQL语句,然后根据SQL语句可能低效的原因做排查,先从索引着手,如果索引没有问题,考虑以上几个方面,数据访问的问题,长难查询句的问题还是一些特定类型优化的问题,逐一回答。

三、真题

SQL语句优化的一些方法。

  • 优化查询过程中的数据访问
  • 访问数据太多导致性能下降;
  • 确定应用程序是否在检索大量超过需要的数据,可能是太多行或列;
  • 确认 MySQL服务器是否在分析大量不必要的数据行;
  • 重复查询相同的数据,可以缓存数据,下次直接读取缓存;
  • 是否在扫描额外的记录。
  • 优化长难的查询语句
  • 切分查询;
  • 分解关联查询
  • 优化特定类型的查询语句
  • 优化 count() 查询;
  • 优化关联查询;
  • 优化子查询(即嵌套查询);
  • 优化 GROUP BY 和 DISTINCT;
  • 优化 LIMIT 分页;
  • 优化 UNION 查询。

注:此题可以根据以上的内容进行一个详细的总结。

【PHP面试题】请简述项目中优化SQL语句执行效率的方法,从哪些方面,SQL语句如何分析?相关推荐

  1. python编写交互界面查分app_Django项目中model的数据处理以及页面交互方法

    Django中Models是什么: 通常,一个Model对应一张数据表, Django中Models以类的形式表现, 它包含一些基本字段以及数据的一些行为 ORM: 对象关系映射(Object Rel ...

  2. vue 微信公众号支付接口_总结vue项目中使用微信公众号支付的方法

    本篇文章给大家带来的内容是总结vue项目中使用微信公众号支付的方法.有一定的参考价值,有需要的朋友可以参考一下,希望对你们有所帮助. 微信公众号支付 1. 使用jssdk调用微信支付,具体查看开发文档 ...

  3. mysql 执行效率命令_MySQL优化--explain 分析sql语句执行效率

    MySQL优化--explain 分析sql语句执行效率 explain 命令 explain 命令在解决数据库性能上市第一推荐使用命令,大部分的性能问题可以通过此命令来简单解决,explain可以用 ...

  4. iar怎么新建立项目_请简述IAR中创建一个应用项目的步骤及配置过程。

    [多选题]公路工程中应用的石灰要求达到( ). [多选题]在石灰工业废渣稳定土施工前,取有代表性石灰样品进行下列试验( ). [单选题]在沥青混合料中掺加适量消石灰粉,可以有效提高沥青混合料的( ). ...

  5. 面试题:JavaEE项目中,你准备如何解决高并发问题?比如1000万人同时登录。作者——DengJun

    面试中遇到了这样的问题,JavaEE项目中,你准备如何解决高并发问题?比如1000万人同时登录. 1 .从最基础的地方做起,优化我们写的代码,减少必要的资源浪费.    a.避免频繁的使用new对象, ...

  6. 分享在实际项目中积累的硬件调试经验 - 调试方法,以及常见调试案例

    文章目录 一.硬件调试的四个目标 二.硬件调试心得 三.一块新的板子的调试思路 四.硬件调试,一些网络资料 五.单片机硬件调试中常见的案例(杂记) 往期系列文章: 1.裸机项目开发经验分享 - 完整开 ...

  7. Django项目中集成富文本编辑器的通用方法,适合KindEditor,xhEditor,NicEditor,wymeditor等 .

    首先,请参考我以前写的一篇博客:如何把nicEditor集成到django中使用 http://blog.csdn.net/huyoo/article/details/4382317 这篇文章中的做法 ...

  8. 如何在项目中利用 git 提高工作效率

    文/陈灵 华为无线网络产品线五级软件专家,在大型软件架构设计.性能优化方面有丰富的成功经验,多次荣获公司/产品线优秀软件架构实践表彰. 华为的明星博主,原创软件技术博客超过一百篇,愈十万字,促进了软件 ...

  9. 请简述php循环控制语句,PHP 循环控制语句几种方法详解_PHP教程

    在php中循环语句一般是使用while,for,foreach而控制语句就是if swicth这些了,下面我来给大家介绍一下php循环控制语句用法吧. 1.if..else循环有三种结构第一种是只有用 ...

最新文章

  1. cassandra框架模型之一——Colum排序,分区策略 Token,Partitioner bloom-filter,HASH
  2. LACP链路聚合-基础篇
  3. 推荐一款github管理神器SourceTree
  4. 调查谋杀案以换取Obra Dinn
  5. Redis为什么变慢了?一文详解Redis性能问题 | 万字长文
  6. 腾讯视频下载官方_腾讯视频评论在哪
  7. Gradle配置国内源
  8. Linux内核学习-字符设备驱动学习(二)
  9. Java 使用poi导入excel,结合xml文件进行数据验证的例子(增加了jar包)
  10. php中global和$GLOBALS[]的分析之一
  11. 收藏一个Excel甘特图模板
  12. android pdf阅读器开发_PDF to EPUB Converter Mac(PDF转EPUB转换器)
  13. QT编译时查找不到GL /usr/bin/ld cannot find -lGL
  14. 移动终端软件测试基础知识,移动终端软件测试基础知识 - Mr.南柯 - 51Testing软件测试网 51Testing软件测试网-软件测试人的精神家园...
  15. 谷歌浏览器前端调试技巧01——使用F12清除缓存
  16. 3D,小白需要理解的点云概念
  17. MPEG4 笔记2(FTYP,MOOV,MVHD)
  18. 蓝桥杯Java B组2015年真题
  19. CVPR 2022 结果出炉,最全论文下载及分类汇总(更新中)
  20. 走进Cosmos之入门

热门文章

  1. python轮转数组及nums和nums[:]的区别
  2. 特步软件测试员工资,特步集团全面预算管理系统——管理员手册V1.1
  3. 无线电通信相关重要指标测试
  4. Unity 事件中心
  5. 分布式数据一致性的探讨
  6. iOS 实现UIButton加小红点
  7. db2取数据库日期时间_DB2日期和时间函数汇总
  8. 老年机打不出电话拨号失败服务器无响应,老年机为什么打不出去电话
  9. html表格的多个下拉菜单,表格设置下拉多个选项
  10. 基于51单片机1602温度显示时钟