Mysql优化之索引优化

9 篇文章 0 订阅
9 篇文章 0 订阅

创建表

CREATE TABLE staffs(
id INT PRIMARY KEY AUTO_INCREMENT,
`name` VARCHAR(24) DEFAULT NULL 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());
INSERT INTO staffs(`name`,`age`,`pos`,`add_time`) VALUES(NULL,23,'test',NOW());

ALTER TABLE staffs ADD INDEX index_staffs_nameAgePos(`name`,`age`,`pos`)

查看索引

在这里插入图片描述
索引优化案例
1.最佳左前缀法则
2.全值匹配
3.索引列上不计算
4.范围之后全失效
5.覆盖索引多使用
6.使用不等会失效
7.使用NULL值要小心
8.模糊查询加右边
9.字符串加单引号
10.尽量不用or查询

最佳左前缀法则
查询时从索引的最左列开始并且不跳过索引中的列

过滤条件要使用索引必须按照索引建立的顺序,依次满足,一旦跳过某个字段,索引后面的字段都无法被使用

多列索引是先按照第一列进行排序,然后在第一列排好序的基础上再对第二列排序,如果没有第一列的话,直接访问第二列,那第二列肯定是无序的,直接访问后面的列就用不到索引

在这里插入图片描述
索引列上不计算
不在索引列上做任何操作(计算、函数、(自动 or 手动)类型转换),可能会导致索引失效而转向全表扫描

在这里插入图片描述

范围之后全失效
使用范围查询后,如果范围内的记录过多,会导致索引失效,因为从自定义索引映射到主键索引需要耗费太多的时间,反而不如全表扫描来得快

建议:将可能做范围查询的字段的索引顺序放在最后
在这里插入图片描述覆盖索引多使用
使用覆盖索引(Using index)会提高检索效率:只访问索引列的查询(索引列和查询列一致,尽量不使用select *)
在这里插入图片描述
在这里插入图片描述
使用不等会失效
在使用不等于(!= 或者<>)时,可能会导致索引失效
在这里插入图片描述

使用NULL值要小心
如果允许字段为空,则

IS NULL 不会导致索引失效
IS NOT NULL 会导致索引失效
在这里插入图片描述

模糊查询加右边
like查询以通配符%开始会导致索引失效,转而变成全表扫描
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
问题: 解决like ‘%字符串%’ 索引不生效的方法:使用覆盖索引(查询的字段尽量和索引字段匹配)

在这里插入图片描述
面试题一
在这里插入图片描述
面试题二

在这里插入图片描述
索引全都用到,底层会有优化器。

在这里插入图片描述
范围查询之后全失效。

在这里插入图片描述
会用到4个索引:
①.mysql底层排序
②.范围查询之后全失效。但是当前范围不失效,所有a4也用到了索引。
4.
在这里插入图片描述
索引2个功能,查找和排序
c3的功能在于排序,而不是查找。
5.
在这里插入图片描述
和上面一样
6.
在这里插入图片描述
中间兄弟不能断

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
排序有效,不受c5影响

在这里插入图片描述
特殊情况:c2已经是常量了

在这里插入图片描述

在这里插入图片描述
分组之前必排序

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

【优化总结口诀】
全值匹配我最爱,最左前缀要遵守;
带头大哥不能死,中间兄弟不能断;
索引列上少计算,范围之后全失效;
Like百分写最右,覆盖索引不写星;
不等空值还有or,索引失效要少用;
VAR引号不可丢,SQL高级也不难!

like ‘aa%’ 相当于有常量了,可以确定一部分范围了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

东北亚大中华区首席搬砖工具人

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值