数据库-MySQL常用查询优化技巧的分析与总结
小职 2021-09-07 来源 :「Code0cean」 阅读 1138 评论 0

摘要:本文主要介绍了数据库-MySQL常用查询优化技巧的分析与总结,通过具体的内容展现,希望对大家数据库MySQL的学习有所帮助。

本文主要介绍了数据库-MySQL常用查询优化技巧的分析与总结,通过具体的内容展现,希望对大家数据库MySQL的学习有所帮助。

数据库-MySQL常用查询优化技巧的分析与总结

数据准备

CREATE TABLE staffs(

id INT PRIMARY KEY AUTO_INCREMENT,

`name` VARCHAR(24)NOT NULL DEFAULT'' COMMENT'姓名',

`age` INT NOT NULL DEFAULT 0 COMMENT'年龄',

`pos` VARCHAR(20) NOT NULL DEFAULT'' COMMENT'职位',

`add_time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT'入职时间'

)CHARSET utf8 COMMENT'员工记录表';


insert into staffs(NAME,age,pos,add_time) values('z3',22,'manager',NOW());

insert into staffs(NAME,age,pos,add_time) values('July',23,'dev',NOW());

insert into staffs(NAME,age,pos,add_time) values('2000',23,'dev',NOW());



create index idx_staffs_nameAgePos on staffs(name,age,pos)


1. 复合索引遵循最佳左前缀法则

如果索引了多例,要遵守最左前缀法则。指的是查询从索引的最左前列开始并且不跳过索引中的列。

数据库-MySQL常用查询优化技巧的分析与总结

另外对于复合索引,MySQL查询不能使用索引中范围条件右边的列,即范围后的索引列都失效。


示例:复合索引在遵循最佳左前缀法则的情况下,使用了范围条件。

数据库-MySQL常用查询优化技巧的分析与总结

EXPLAIN SELECT * FROM staffs where name = 'Alice' AND age > 21 AND pos = 'HR';


key_len=198,说明只有 name 和 age 两个索引生效,而后面的 pos 没有用上索引。


如果不使用范围查询,复合查询的执行计划如下:

数据库-MySQL常用查询优化技巧的分析与总结

查询级别达到了ref,使用到了 name , age和pos索引列。


2. 不在索引列上做任何操作

不在索引列上做任何操作(计算、函数、(自动or手动)类型转换),会导致索引失效而转向全表扫描.

数据库-MySQL常用查询优化技巧的分析与总结


但对要查询的值使用函数操作可以正常使用索引,如使用CONCAT函数拼接字符串。

数据库-MySQL常用查询优化技巧的分析与总结


3. 尽量做到索引覆盖

覆盖索引的概念:又叫索引覆盖,select的数据列只用从索引中就能够取得,不必读取数据行,MySQL可以利用索引返回select列表中的字段,而不必根据索引再次读取数据文件。

数据库-MySQL常用查询优化技巧的分析与总结


4. 尽量不用不等于号(!=或<>)

MySQL在使用不等于(!=或者<>)的时候无法使用索引会导致全表扫描。所以应尽量避免在 WHERE 子句中使用 != 或 <> 操作符。MySQL 只有对以下操作符才使用索引:<,<=,=,>,>=,BETWEEN,IN,以及某些时候的 LIKE。

数据库-MySQL常用查询优化技巧的分析与总结


5. 尽量避免使用is null和is not null

is null和is not null 的使用会导致索引不能使用,应该尽量避免在 WHERE 子句中对字段进行 NULL 值判断,创建表时 NULL 是默认值,但大多数时候应该使用 NOT NULL,或者使用一个特殊的值,如 0,-1 作为默认值。

数据库-MySQL常用查询优化技巧的分析与总结


6. 注意like模糊匹配

like以通配符开头(’$abc…’)mysql索引失效会变成全表扫描操作

数据库-MySQL常用查询优化技巧的分析与总结

但是总会有的业务场景必须以通配符开头模糊查找,对应的解决办法是使用索引覆盖,即查询的字段可以是主键和其他建立索引的字段,从而避免全表扫描。


简单示例:

数据库-MySQL常用查询优化技巧的分析与总结


7. 尽量不使用or

应尽量避免在 WHERE 子句中使用 OR 来连接条件,否则将导致引擎放弃使用索引而进行全表扫描,可以使用 UNION 合并查询,如:


select id from t where num=10 union all select id from t where num=20

数据库-MySQL常用查询优化技巧的分析与总结

使用联合查询:

数据库-MySQL常用查询优化技巧的分析与总结


8. 注意数据类型问题

需要注意数据类型问题,如果条件列是字符串,则条件值应该与条件列属性相同,避免隐式转换而导致的索引失效。


–注意:


如果是条件列是字符串类型,条件值为数字的话索引会失效。


但是如果条件列是整型,条件值为字符串的话,索引则不会用影响。

数据库-MySQL常用查询优化技巧的分析与总结

age是整型,但是查询条件列使用字符串,依然会使用到索引。


数据库-MySQL常用查询优化技巧的分析与总结

9. order by关键字优化

9.1 基本原则

ORDER BY子句,尽量使用Index方式排序,避免使用FileSort方式排序。尽可能在索引列上完成排序操作,并且对于复合索引应该遵照索引建的最佳左前缀法则


9.2 优化策略

1.增大sort_buffer_size参数的设置

2.增大max_length_for_sort_data参数的设置

数据库-MySQL常用查询优化技巧的分析与总结


9.3 order by使用总结

MySQL有两种排序方式:文件排序或扫描有序索引排序。MySQL能为排序与查询使用相同的索引。

数据库-MySQL常用查询优化技巧的分析与总结


10. group by关键字优化

groupby实质是先排序后进行分组,所以注意点和order by大致相同,当无法使用索引列,增大max_length_for_sort_data参数的设置+增大sort_buffer_size参数的设置。where高于having,能写在where限定的条件就不要去having限定了。


总结

最后以复合索引为列,具体查询条件是否使用到索引的案例如下:

数据库-MySQL常用查询优化技巧的分析与总结

帮助记忆的口诀:

数据库-MySQL常用查询优化技巧的分析与总结



我是小职,记得找我

✅ 解锁高薪工作

✅ 免费获取基础课程·答疑解惑·职业测评

数据库-MySQL常用查询优化技巧的分析与总结

本文由 @小职 发布于职坐标。未经许可,禁止转载。
喜欢 | 1 不喜欢 | 0
看完这篇文章有何感觉?已经有1人表态,100%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式IT培训就业服务领导者 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved

208小时内训课程