MySQL正确使用索引

2020-12-01  本文已影响0人  爱折腾的傻小子
需要解决的问题

InnoDB存储引擎 B+树结构
B+
读取数据

Mysql中索引
查询走索引是什么意识?
b+树中数据检索过程
b+

b+

b+

b+

查询包含f的记录
最左匹配原则
b+

索引区分度
正确使用索引
alter table test1 modify id int not null primary key;
select * from test1 where id = 1000000;

select count(*) from test1 where id between 100 and 110;

select * from test1 a where a.id in (100000, 100001, 100002);

-- 在name、sex两个字段上分别建个索引
create index idx1 on test1(name);
create index idx2 on test1(sex);
select * from test1 where name='javacode3500000' and sex=2;

-- 使用name索引
select count(*) from test1 a where a.name like 'javacode1000%';
-- 未使用name索引
select count(*) from test1 a where a.name like '%javacode1000%';

select * from test1 where name='javacode3500000';

select id,name from test1 where name='javacode3500000';
-- name对应id1索引,id为主键,所以idx1索引数叶子节点包含name、id的值,这个查询只用走idx2这一个索引就可以了,如果select后面使用*,还需要一次回表获取sex、email的值
-- 所以写sql的时候,尽量避免使用*,*可能会多一次回表操作,需要看一下是否可以使用索引覆盖来实现,效率更高一些。

select count(id) from test1 a where name like 'javacode35%' and sex = 1;

-- 使用索引
select * from test1 where name = '1';
-- 未使用索引
select * from test1 where name = 1;

-- 索引无效
select * from test1 a where concat(a.name,'1') = 'javacode11';

-- 使用索引
select * from test1 a where id = 2 - 1;
-- 索引无效
select * from test1 a where id+1 = 2;

使用索引优化排序

总结

资料来源:【公众号】大侠学JAVA

上一篇 下一篇

猜你喜欢

热点阅读