MYSQL复习——第五章:索引与算法

it2023-08-08  73

索引分类

数据结构角度 全文索引哈希索引B树索引 聚集索引非聚集索引(辅助索引)MRR优化ICP优化逻辑角度 主键索引唯一索引普通索引

Cardinality值

索引分类

按照数据结构:B树索引;Hash索引;全文索引

按照物理存储(主要指B树索引):聚簇索引(聚集索引);非聚集索引(辅助索引)

按照逻辑:主键索引;唯一索引;单列索引;复合索引

5.1 数据结构角度

全文索引

用于查找数据库中的任意内容。

实现方式为倒排索引,在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过滤,将这一步骤放在了存储引擎层。     

5.2 逻辑角度

主键索引: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);创建全文索引

Innodb如何维护索引

语句:Alter table...或者CREATE/ DROP INDEX

维护方法:

对于主键索引:创建新表结构,复制原表到新表,删除原表,把新表改名成原表

对于辅助索引:加S锁

5.3 Cardinality值

对取值范围广的字段加索引更合适,Cardinality值是数据库预估的范围值(该字段有多少个不同的value,越多说明效果越好)。

数据库通过随机采样的方式预估该值。优化器会根据这个值来判断是否使用这个索引。

最新回复(0)