【PHP面试题】请简述项目中优化SQL语句执行效率的方法,从哪些方面,SQL语句如何分析?
文章目录
- 一、考点
- 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 BY
和ORDER 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
来优化UNION
,UNION ALL
会将重复的数据显示出来,可以在应用层面把重复的数据筛掉,但是我们查询的时候,还使用UNION ALL
, 对MySQL的性能损耗会降低很多,提高我们的查询效率)。
二、解题方法
对于此类考题,先说明如何定位低效SQL语句,然后根据SQL语句可能低效的原因做排查,先从索引着手,如果索引没有问题,考虑以上几个方面,数据访问的问题,长难查询句的问题还是一些特定类型优化的问题,逐一回答。
三、真题
SQL语句优化的一些方法。
- 优化查询过程中的数据访问;
- 访问数据太多导致性能下降;
- 确定应用程序是否在检索大量超过需要的数据,可能是太多行或列;
- 确认 MySQL服务器是否在分析大量不必要的数据行;
- 重复查询相同的数据,可以缓存数据,下次直接读取缓存;
- 是否在扫描额外的记录。
- 优化长难的查询语句;
- 切分查询;
- 分解关联查询
- 优化特定类型的查询语句;
- 优化 count() 查询;
- 优化关联查询;
- 优化子查询(即嵌套查询);
- 优化 GROUP BY 和 DISTINCT;
- 优化 LIMIT 分页;
- 优化 UNION 查询。
注:此题可以根据以上的内容进行一个详细的总结。
【PHP面试题】请简述项目中优化SQL语句执行效率的方法,从哪些方面,SQL语句如何分析?相关推荐
- python编写交互界面查分app_Django项目中model的数据处理以及页面交互方法
Django中Models是什么: 通常,一个Model对应一张数据表, Django中Models以类的形式表现, 它包含一些基本字段以及数据的一些行为 ORM: 对象关系映射(Object Rel ...
- vue 微信公众号支付接口_总结vue项目中使用微信公众号支付的方法
本篇文章给大家带来的内容是总结vue项目中使用微信公众号支付的方法.有一定的参考价值,有需要的朋友可以参考一下,希望对你们有所帮助. 微信公众号支付 1. 使用jssdk调用微信支付,具体查看开发文档 ...
- mysql 执行效率命令_MySQL优化--explain 分析sql语句执行效率
MySQL优化--explain 分析sql语句执行效率 explain 命令 explain 命令在解决数据库性能上市第一推荐使用命令,大部分的性能问题可以通过此命令来简单解决,explain可以用 ...
- iar怎么新建立项目_请简述IAR中创建一个应用项目的步骤及配置过程。
[多选题]公路工程中应用的石灰要求达到( ). [多选题]在石灰工业废渣稳定土施工前,取有代表性石灰样品进行下列试验( ). [单选题]在沥青混合料中掺加适量消石灰粉,可以有效提高沥青混合料的( ). ...
- 面试题:JavaEE项目中,你准备如何解决高并发问题?比如1000万人同时登录。作者——DengJun
面试中遇到了这样的问题,JavaEE项目中,你准备如何解决高并发问题?比如1000万人同时登录. 1 .从最基础的地方做起,优化我们写的代码,减少必要的资源浪费. a.避免频繁的使用new对象, ...
- 分享在实际项目中积累的硬件调试经验 - 调试方法,以及常见调试案例
文章目录 一.硬件调试的四个目标 二.硬件调试心得 三.一块新的板子的调试思路 四.硬件调试,一些网络资料 五.单片机硬件调试中常见的案例(杂记) 往期系列文章: 1.裸机项目开发经验分享 - 完整开 ...
- Django项目中集成富文本编辑器的通用方法,适合KindEditor,xhEditor,NicEditor,wymeditor等 .
首先,请参考我以前写的一篇博客:如何把nicEditor集成到django中使用 http://blog.csdn.net/huyoo/article/details/4382317 这篇文章中的做法 ...
- 如何在项目中利用 git 提高工作效率
文/陈灵 华为无线网络产品线五级软件专家,在大型软件架构设计.性能优化方面有丰富的成功经验,多次荣获公司/产品线优秀软件架构实践表彰. 华为的明星博主,原创软件技术博客超过一百篇,愈十万字,促进了软件 ...
- 请简述php循环控制语句,PHP 循环控制语句几种方法详解_PHP教程
在php中循环语句一般是使用while,for,foreach而控制语句就是if swicth这些了,下面我来给大家介绍一下php循环控制语句用法吧. 1.if..else循环有三种结构第一种是只有用 ...
最新文章
- cassandra框架模型之一——Colum排序,分区策略 Token,Partitioner bloom-filter,HASH
- LACP链路聚合-基础篇
- 推荐一款github管理神器SourceTree
- 调查谋杀案以换取Obra Dinn
- Redis为什么变慢了?一文详解Redis性能问题 | 万字长文
- 腾讯视频下载官方_腾讯视频评论在哪
- Gradle配置国内源
- Linux内核学习-字符设备驱动学习(二)
- Java 使用poi导入excel,结合xml文件进行数据验证的例子(增加了jar包)
- php中global和$GLOBALS[]的分析之一
- 收藏一个Excel甘特图模板
- android pdf阅读器开发_PDF to EPUB Converter Mac(PDF转EPUB转换器)
- QT编译时查找不到GL /usr/bin/ld cannot find -lGL
- 移动终端软件测试基础知识,移动终端软件测试基础知识 - Mr.南柯 - 51Testing软件测试网 51Testing软件测试网-软件测试人的精神家园...
- 谷歌浏览器前端调试技巧01——使用F12清除缓存
- 3D,小白需要理解的点云概念
- MPEG4 笔记2(FTYP,MOOV,MVHD)
- 蓝桥杯Java B组2015年真题
- CVPR 2022 结果出炉,最全论文下载及分类汇总(更新中)
- 走进Cosmos之入门