PHP重点知识复习 – MySQL的查询优化(待完善)

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

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 别名 desc

分析单条SQL语句

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

1.访问数据太多导致查询性能下降

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

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

4.避免使用如下SQL语句

查询不需要的记录,使用 limit 解决

多表关联返回全部列,指定 A.id,A.name,B.age

总是取出全部列,SELECT * 会让优化器无法完成索引覆盖扫描的优化

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

5.是否在扫描额外的记录

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

使用索引覆盖扫描,把所用的列都放到索引中,这样存储引擎不需要回表获取对应行就可以返回结果

改变数据库和表的结构,修改数据表范式

重写SQL语句,让优化器可以以更优的方式执行查询

三、优化长难的查询语句

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

MySQL内部每秒能扫描内存中上百万行数据,相比之下,响应数据给客户端就要慢得多

使用尽可能少得查询是好的,但是有时将一个大的查询分解为多个小的查询是很有必要的

1.切分查询

将一个大的查询分为多个小的相同的查询

一次性删除1000万的数据要比一次删除1万,暂停一会的方案更加损耗服务器开销

2.分解关联查询

可以将一条关联语句分解成多条SQL来执行

让缓存的效率更高

执行单个查询可以减少锁的竞争

在应用层左关联可以更容易对数据库进行拆分

3.优化 conut() 查询

count(*)中的*会忽略所有的列,直接统计所有行数,因此不要使用count(列名)

4.优化关联查询

确定ON或者USING子句的列上有索引

确保 GROUP BY 和 ORDER BY 中只有一个表中的列,这样MySQL才有可能使用索引

5.优化子查询

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

6.优化 GROUP BY 和 DISTINCT

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

关联查询中,使用标识列(主键列或auto_increment列)进行分组的效率会更高

如果不需要 ORDER BY,进行GROUP BY 时使用ORDER BY NULL,MySQL不会再进行文件排序

WITH ROLLUP超级聚合,尽量不使用,可以挪到应用程序处理

7.优化LIMIT 分页

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

可以记录上次查询的最大ID,下次查询时直接根据该ID来查询

8.优化UNION查询

UNION ALL的效率高于UNION

解题方法

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

 

暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇