目录与学习目标
1:前置建表语句_DDL
2:联合索引
3:MySQL5.6版本后的回表优化
1:前置建表语句_DDL
//先创建一表 ID为主键索引 K为普通索引
create table T (
ID int primary key,
k int NOT NULL DEFAULT 0,
s varchar(16) NOT NULL DEFAULT '',
index k(k)
)engine=InnoDB;
对于Mysql通过索引查询来说 什么叫回表?
当需要查询的数据只在主键索引上有。然后我们回到主键索引树搜索的过程,称为回表。
如使用SQL:
select * from T where k = 1;
什么叫覆盖索引:
在这个查询里面,索引 k 已经“覆盖了”我们的查询需求,我们称为覆盖索引。这样可以避免回表
如使用SQL:
select Id from Twhere k =1;
//先创建一表 name_age 为联合索引
CREATE TABLE `tuser` (
`id` int(11) NOT NULL,
`id_card` varchar(32) DEFAULT NULL,
`name` varchar(32) DEFAULT NULL,
`age` int(11) DEFAULT NULL,
`ismale` tinyint(1) DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `id_card` (`id_card`),
KEY `name_age` (`name`,`age`)
) ENGINE=InnoDB
2:联合索引
联合索引可以 直接使用里面的一个索引的 value值
来查找另一个索引里面的 value 而不用经过主键索引
当有一个高频请求时,通过name来查询age,可以采用联合索引的方式(空间换时间)
最左前缀原则:
B+ 树这种索引结构,可以利用索引的“最左前缀”,来定位记录。(即联合索引的最左边索引可以充当 单个索引)
联合索引的创建原则
1:如果通过调整顺序,可以少维护一个索引,那么这个顺序往往就是需要优先考虑采用的;
2:考虑空间((name,age) 的联合索引和一个 (age) 的单字段索引。age占用的空间比name要小)
3:MySQL5.6版本后的回表优化
MYSQL:5.6后的优化(index condition pushdown)(索引下推)
可以在索引遍历过程中,对索引中包含的字段先做判断,直接过滤掉不满足条件的记录,减少回表次数。
以前(Mysql 5.6前)
select * from tuser where name like '张%' and age=10 ;
1:通过name找到 ID3 ID4 ID5 ID6
2:通过ID一个个进行会表查询
回表4次
现在(Mysql 5.6后)
1:通过name找到 ID3 ID4 ID5 ID6
2:通过age找到 ID4 ID5
回表2次