索引分类
数据结构角度 全文索引哈希索引B树索引 聚集索引非聚集索引(辅助索引)MRR优化ICP优化逻辑角度 主键索引唯一索引普通索引Cardinality值
按照数据结构:B树索引;Hash索引;全文索引
按照物理存储(主要指B树索引):聚簇索引(聚集索引);非聚集索引(辅助索引)
按照逻辑:主键索引;唯一索引;单列索引;复合索引
全文索引
用于查找数据库中的任意内容。
实现方式为倒排索引,在Auxiliary Table(辅助表)中存储了单词和文档映射,有两种表现形式:
1. inverted file index: {单词,单词所在文档ID} eg. {old:1, 4} 表示old出现在文档1和文档4中
2. full inverted index: {单词,(单词所在文档ID,文档中位置)} eg.{old:(1:6), (2:1)} 表示old出现在文档1 的第6个单词
哈希索引
对于范围查找(大于,小于)无能为力,对于等值查询快速
自适应哈希索引
B树索引
对于innodb来说:
非数据页的索引页存放:key+数据页的偏移量;数据页的索引页存放:key+行记录非聚集索引(辅助索引):可能要回表——>其他索引都是非聚集的
聚簇索引:表中数据按照主键顺序存放——>Innodb主键索引
特点:高扇出性,一般高度在2-4层。分为聚集和非聚集索引
MRR(Multi-Range Read)优化
解决的问题:查询范围辅助索引时,如果没有覆盖索引需要回表查询。在查询前根据主键进行排序。将随机IO变成顺序IO。
原理:在内存中将第一次返回的辅助索引按照主键索引进行排序
ICP(Index Condition Pushdown)优化
当使用ICP优化后,Extra会看到Using index condition提示。
解决的问题:原先根据索引查找记录,在内存中再根据WHERE过滤。优化后MYSQL在取出索引的同时进行WHERE过滤,将这一步骤放在了存储引擎层。
主键索引:Innodb默认索引,不能重复,不能为Null;如果没主键,自动创建6个字节的主键
唯一索引:不能重复,允许为Null
可以通过 ALTER TABLE table_name ADD UNIQUE (column); 创建唯一索引可以通过 ALTER TABLE table_name ADD UNIQUE (column1,column2); 创建唯一组合索引普通索引: 基本的索引类型,没有唯一性的限制,允许为NULL值
可以通过ALTER TABLE table_name ADD INDEX index_name (column);创建普通索引
可以通过ALTER TABLE table_name ADD INDEX index_name(column1, column2, column3);创建组合索引
全文索引: 是目前搜索引擎使用的一种关键技术。
可以通过ALTER TABLE table_name ADD FULLTEXT (column);创建全文索引语句:Alter table...或者CREATE/ DROP INDEX
维护方法:
对于主键索引:创建新表结构,复制原表到新表,删除原表,把新表改名成原表
对于辅助索引:加S锁
对取值范围广的字段加索引更合适,Cardinality值是数据库预估的范围值(该字段有多少个不同的value,越多说明效果越好)。
数据库通过随机采样的方式预估该值。优化器会根据这个值来判断是否使用这个索引。