十五、索引应用规范

MySQL优化常用的工具

作为面试题常考
你做过哪些优化?
你用过什么优化工具?
你对索引这块怎么优化的?
题目意思: 我们公司业务慢,请你从数据库的角度分析原因

explain(desc)使用场景
mysql出现性能问题,我总结有两种情况:.

第一种情况
应急情况:数据库突然很慢,资源耗尽
处理过程:

  1. show processlist; 获取到导致数据库卡慢的语句
  2. explain 判断查询语句为什么慢,分析SQL的执行计划,有没有走索引,索引的类型情况
  3. 建索引,如果建完索引情况还没有改善则需要改SQL语句

第二种情况
一段时间慢(持续性的):

  1. 记录慢日志slowlog,分析slowlog
  2. explain 分析SQL的执行计划,有没有走索引,索引的类型情况
  3. 建索引,改语句

索引应用规范

DBA运维规范
建立索引的原则
1、建表必须要有主键,一般是无关列,自增长
2、经常做为where条件列做为索引列,如经常使用order by group by join on, distinct子句列
3、最好使用唯一值多的列作为联合索引第一列,其他的按照联合索引优化细节来做
4、列值长度较长的索引列,我们建议使用前缀索引.
5、降低索引条目,一方面不要创建没用索引,清理不常使用的索引
percona toolkit(pt-duplicate-key-checker)工具可以检查索引应用的频率,如果少可以考虑删除索引。
6、索引维护要避开业务繁忙期
7、小表不需要建索引,例如几百行,几千行的表不需要创建索引

sqlyog工具查看冗余索引


开发规范
不走索引的情况
1、没有查询条件,或者查询条件没有建立索引
select * from city; 走全表
select * from city where 1=1; 走全表
2、查询结果集是原表中的大部分数据,大约在25%以上,这时优化器就走全表扫描而不走索引。
3、索引本身失效,统计数据不真实,如果对索引列频繁更新时会导致索引失效。

面试题:同一个语句突然变慢?
统计信息过旧,对索引列频繁更新,导致的索引自维护不及时,从而导致索引失效

4、在索引列上使用函数运算,或者对索引列进行数学运算,运算包括(+,-,*,/,! 等),不会走索引

5、隐式转换导致索引失效.
创建xyz测试表,手机号列使用char(11)

插入数据,可以使用字符串也可以使用int

创建索引

使用单引号查询跟不使用单引号都能查询到值

可以看到,带单引号查询时要走索引

不带单引号走全表扫描

所以根据第4点,int类型通过函数转换成字符串,因此做了函数转换从而导致索引失效。

6、在辅助索引中<> ,not in 不走索引,在主键索引中走range
7、like "%aa" 百分号在最前面不走,而走全表扫描
8、联合索引


学习来自:郭老师博客,老男孩深标DBA课程 第四章

posted @ 2021-02-17 22:23  努力吧阿团  阅读(71)  评论(0编辑  收藏  举报