美文网首页
索引优化1

索引优化1

作者: 卫泽洪_70a7 | 来源:发表于2021-05-27 15:05 被阅读0次

研究索引失效的问题

一、准备工作

1、建表

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 '员工记录表';

2、插入数据

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());

3、创建索引

alter table staffs add index idx_staffs_nameAgePos(name,age,pos);

二、索引不失效的口诀

1、全职匹配我最爱
2、最佳左侧前缀法则
3、不在索引列上做任何操作(计算、函数、(自动or手动)类型转换),会导致索引失效而转向全表扫描
4、存储引起不能使用索引中范围条件右边的列
5、尽量使用覆盖索引(只访问索引的查询(索引列和查询列一致)),减少select *
6、mysql在使用不等于(!=或者<>)的时候无法使用索引会导致全表扫描
7、is null,is not null也无法使用索引
8、like以通配符开头('%abc...'),mysql索引失效会变成全表扫描的操作
9、字符串不加单引号索引失效
10、少用or,用它来连接时会索引失效

1、全职匹配我最爱

EXPLAIN select * from staffs where name = 'July' and age = 23 and pos = 'dev';

上面查询语句使用到了复合索引的三个字段,属于全职匹配。
2、最佳做前缀法则

explain select * from staffs where name = 'July';
image.png
EXPLAIN select * from staffs where age = 23 and pos = 'dev';
image.png

带头大哥不能死!!!

EXPLAIN select * from staffs where name = 'July' and pos = 'dev';
image.png

中间兄弟不能断!!!

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

EXPLAIN select * from staffs where left(name,4) = 'July';
image.png

索引列上少计算!!!

4、存储引起不能使用索引中范围条件右边的列

EXPLAIN select * from staffs where  name='z3' and age > 20 and pos = 'manager';
image.png

5、尽量使用覆盖索引(只访问索引的查询(索引列和查询列一致)),减少select *

EXPLAIN select * from staffs where  name='July' and age = 23 and pos = 'dev';
image.png
EXPLAIN select name,age,pos from staffs where  name='July' and age = 23 and pos = 'dev';
image.png

6、mysql在使用不等于(!=或者<>)的时候无法使用索引会导致全表扫描

EXPLAIN select * from staffs where  name!='July';
image.png

具体要看生产环境,不要因为这个束手束脚

7、is null,is not null也无法使用索引

EXPLAIN select * from staffs where  name is null;
image.png

8、like以通配符开头('%abc...'),mysql索引失效会变成全表扫描的操作

EXPLAIN select * from staffs where  name like '%July';
image.png

like%加右边!!!

问题:如何解决like '%字符串%'时索引不被使用的方法?
mybatis中like sql如何编写:要拼接,不要写死。使用CONCAT()函数连接参数形式

我就是要两边写%,怎么办???

1)新建表

create table tbl_user(
id INT(11) not null auto_increment,
name varchar(20) default null,
age int(11) default null,
email varchar(20) default null,
primary key(id)
)ENGINE=INNODB auto_increment=1 default charset=utf8;

2)插入数据

insert into tbl_user(name,age,email) values('1aa1',21,'b@163.com');
insert into tbl_user(name,age,email) values('2aa2',222,'a@163.com');
insert into tbl_user(name,age,email) values('3aa3',265,'c@163.com');
insert into tbl_user(name,age,email) values('4aa4',21,'d@163.com');

3)创建索引

create index idx_user_nameAge on tbl_user(name,age);

4)开始分析

explain select name,age from tbl_user where name like '%aa%';
image.png

9、字符串不加单引号索引失效

select * from staffs where name = 2000
image.png

10、少用or,用它来连接时会索引失效

explain select * from staffs where name = 'July' or name = 'z3'
image.png

相关文章

  • MySQL深入理解_SQL优化

    索引优化1[https://juejin.im/post/6844903954392825869] 索引优化2[h...

  • 索引优化1

    研究索引失效的问题 一、准备工作 1、建表 2、插入数据 3、创建索引 二、索引不失效的口诀 1、全职匹配我最爱 ...

  • 案例加源码:万字长文带你彻底搞懂MySQL的索引优化

    一、索引优化 1,单表索引优化 建表 查询案例 查询category_id为1且comments 大于1的情况下,...

  • sql优化的几种方法

    Mysql的优化,大体可以分为三部分:索引的优化,sql语句的优化,表的优化 1.索引的优化 只要列中含有NULL...

  • MySQL索引知多少

    mysql索引 总结关于mysql的索引,查询优化,SQL技巧等 1 索引类型 B-Tree索引 Hash索引 ...

  • 性能调优之SQL优化

    性能调优之SQL优化如何加快查询速度?1、升级硬件2、根据查询条件,建立索引,优化索引、优化访问方式,限制结果集的...

  • MySQL,必须掌握的6个知识点

    目录 一、索引B+ Tree 原理 MySQL 索引 索引优化 索引的优点 索引的使用条件 二、查询性能优化使用 ...

  • Mysql 优化

    1.Sql优化 1)sql优化分析2)索引优化3)sql语句优化4)一些常用的技巧优化 (正则、函数) 2.优化数...

  • sql优化的一般策略

    sql 优化的一般策略:索引优化,sql改写,参数优化,优化器 索引优化 以select * from vvsho...

  • 搜索引擎优化

    搜索引擎优化 SEO(Search Engine Optimization):汉译为搜索引擎优化。搜索引擎优化是一...

网友评论

      本文标题:索引优化1

      本文链接:https://www.haomeiwen.com/subject/pppksltx.html