1.索引优化
1.1 索引的分类
分类角度 | 索引名称 |
---|---|
数据结构 | B+树,Hash索引,B-Tree 等 |
存储层面 | 聚簇索引,非聚簇索引 |
逻辑层面 | 主键索引,普通索引,组合索引,唯一索引,空间索引 |
1.2 回表
假设我们执行一条查询语句
select * from person where ID = 6,因为直接使用的是主键ID查询,所以就会用主键索引,由于主键索引直接关联了整行所有数据,所以,引擎只要执行一次就能查询出结果。
如果执行的sql语句是非主键索引
select * from person where age = 18
上述语句会走age的普通索引,索引先根据age搜索等于18的索引记录,找到ID=10的记录,然后再到主键索引搜索一次,然后拿出需要查询的数据。
从普通索引查出主键索引,然后查询出数据的过程叫做回表。由于回表需要多执行一次查询,这也是为什么主键索引要比普通索引要快的原因,所以,我们要尽量使用主键查询。
1.3 覆盖索引
我们通常创建索引的依据都是根据查询的where条件,但是这只是我们通常的做法,我们根据上面的分析可以知道,如果要想查询效率高,第一,使用主键索引,第二,避免回表,也就是尽可能的在索引中就能获取想要的数据。如果一个索引包含了需要查询的字段,那么我们就叫做"覆盖索引"
建立复合索引:
create index idx_staffs_nameAgePos on staffs(name,age,pos);
-- idx_为建立的复合索引
-- (name,age,pos)是为这三个字段所创建的索引
1.4 索引的口诀
全值匹配我最爱,最左前缀要遵守
带头大哥不能死,中间兄弟不能断
索引列上少计算,范围之后全失效
like百分写最右,覆盖索引不写星
不等空值还有or,索引失效要少用
varchar引号不可丢,SQL高级也不难
2.0 索引优化案例
2.1 单表优化
#建表
create table article(
id int unsigned not null primary key auto_increment,
author_id int unsigned not null,
category_id