三、组合索引 当包含多个列作为索引,需要注意的是正确的顺序依赖于该索引的查询,同时需要考虑如何更好的满足排序和分组的需要 案例: 建立组合索引 a,b,c ,不同SQL语句使用索引情况 语句索引是否发挥作用
where a=3是,只使用了a
where a=3 and b=5是,使用了a,b
where a =3 and b = 5 and c= 4是,使用了a,b,c
where a = 3 or c = 4否
where a = 3 and c= 4是,仅使用了a
where a = 3 and b > 10 and c = 7是,使用了a,b
where a = 3 and b like '%mxn%' and c=7使用了a四、聚簇索引与非聚簇索引4.1 聚簇索引4.2 非聚簇索引五、覆盖索引5.1 基本介绍如果一个索引包含所有需要查询的字段的值,我们称之为覆盖索引 不是所有类型的索引都可以称为覆盖索引,覆盖索引必须要存储索引列的值 不同的存储实现覆盖索引的方式不同,不是所有的引擎都支持覆盖索引,memory不支持覆盖索引
5.2 优势1、索引条目通常远小于数据行大小,如果只需要读取索引,那么mysql就会极大的较少数据访问量
2、因为索引是按照列值顺序存储的,所以对于IO密集型的范围查询会比随机从磁盘读取每一行数据的IO要少的多
3、一些存储引擎如MYISAM在内存中只缓存索引,数据则依赖于操作系统来缓存,因此要访问数据需要一次系统调用,这可能会导致严重的性能问题
4、由于INNODB的聚簇索引,覆盖索引对INNODB表特别有用 5.3 案例演示1、当发起一个被索引覆盖的查询时,在explain的extra列可以看到using index的信息,此时就使用了覆盖索引
2、在大多数存储引擎中,覆盖索引只能覆盖那些只访问索引中部分列的查询。不过,可以进一步的进行优化,可以使用innodb的二级索引来覆盖查询。 例如:actor使用innodb存储引擎,并在last_name字段又二级索引,虽然该索引的列不包括主键actor_id,但也能够用于对actor_id做覆盖查询 |