复合索引
创建索引的时候可以选择多列,这样的索引叫复合索引;例如
CREATE TABLE `account4` (
`id` bigint(20) DEFAULT NULL,
`name` varchar(6) DEFAULT NULL,
`balance` decimal(10,0) DEFAULT NULL,
primary key idx_id(id),
key idx_name_balance(name,balance)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
插入一行数据
insert into account4 value (1,'jim',33);
这里的 idx_name_balance 便是一个复合索引
覆盖索引
那么什么是覆盖索引呢?附一张《高性能mysql》里的一页信息,从截图里可以看出覆盖索引我们可以称之为工具,它的发生场景是:我们的查询条件和输出的字段是一个复合索引列的子集;
以account4表为例子,
select name,balance from account4 where name = 'jim' and balance = 33;
便是一个覆盖索引查询,因为name和balance都在查询输出列并作为where过滤条件,我们可以通过执行计划看出来:执行计划的Extra 有Using index则就是覆盖索引的标记
增加一个条件
主键列表作为输出
我们修改一下select语句,新增一个id
有人可能会问,按照定义这个应该不是覆盖索引场景,因为输出列多了一个id;
但是主键是一个特殊的存在,我们建立的二级索引在存储的时候是会连同该行的主键值一起存储的,只要查询的列只需要通过扫描索引而不需要二次索引查询获得就叫做覆盖索引;
覆盖索引很大程度上提高了查询效率
主键列作为条件
我们再修改一下sql
有的同学会问,这种情况如果按照上面的描述,应该就是一个覆盖索引场景了;但是mysql在分析执行计划的时候,发现有主键列参与了where过滤,那么这个查询就会优先走主键索引就无需二次索引(即通过二级索引先找到主键,再根据主键索引去查询真实数据);