哈希索引
是自适应的,不能人为干预
是否在一张表中生成哈希索引。B+树索引
并不能找到一个给定键值的具体行,只能找到对应的页,然后把页读到内存,再在内存中进行查找。- 在数据库的
聚集索引
(Clustered Index)中,叶子节点直接包含卫星数据(一整行数据)。在非聚集索引
(NonClustered Index)中,叶子节点带有指向卫星数据的指针(其实就是相应行的聚集索引键)。 - 索引的
Cardinality
属性表示索引中唯一值的数目的估计值。优化器会根据这个值来判断是否使用这个索引。但是这个值不是实时更新的,所以获取到的值不一定准确,如果需要更新索引的信息,可以使用analyze table t
命令。在非高峰期,对核心表做analyze table
操作,可以让优化器和索引更好为你工作。Cardinality/表总行数
越大越接近1,创建索引的效果越好。 - 对于辅助索引的创建,InnoDB存储引擎会对创建索引的表加上一个
S锁
。在创建的过程中,不需要重建表,可进行读操作,不可进行写操作,这种创建索引的方式称为FIC
。FIC只限定于辅助索引,对于主键的创建和删除同样需要重建一张表。 - InnoDB存储引擎实现
Online DDL
的原理是在执行创建或删除操作的同时,将INSERT/UPDATE/DELETE这类DML操作日志写入到一个缓冲中,待完成索引创建后再将重做应用到表上。 - 在访问表中
很少一部分
数据时使用B+树索引才有意义。像性别字段,根据男或女来查,可能查出全表百分之50的数据,没有意义。 - 为什么性别不适合建立索引呢?因为访问索引需要有额外的IO开销,从索引中拿到的只是地址,要想访问到数据还是要对表进行一次IO,假如要从三百万行数据中取几条数据的话,可以迅速定位,但是要想从三百万行数据中取出150W行的数据,那么就要访问150W次索引,再访问150W次数据,加起来的开销并不比全表扫描小。
- 数据库引擎不会再每次INSERT和UPDATE操作之后就进行Cardinality的统计,这样对数据库压力很大,通过
采样
的方式进行更新,策略为:1.表中1/16的数据已经发生过变化;2.stat_modified_counter(表数据更新次数)>2000 000 000。
2是为了防止对某些特定的数据频繁更新而导致不统计Cardinality。随机采样是指每次统计都随机选取8个叶子节点进行统计,所以每次统计出来的数量可能不一样。 - 联机事务处理
OLTP
(on-line transaction processing)、联机分析处理OLAP
(On-Line Analytical Processing)。 - 对于
(a,b)
的联合索引,WHERE a = xxx AND b = xxx
和WHERE a = xxx
都可以用到这个索引,WHERE b = xxx
不可以,因为叶子节点的b不是有序的。 - 对于
(a,b)
的联合索引,a相同的叶子节点内,按b排序,所以当WHERE a = xxx ORDER BY b
不需要进行一次额外的排序,本身就是有序的。 - 如果一个索引
包含
了(或覆盖
了)满足查询语句中字段
与条件
的数据就叫做覆盖索引
。这类查询不需要去表里查数据,只查索引就可以了。通常情况下,诸如(a,b)的联合索引,一般不可以选择列b中所谓的查询条件,但是如果是统计操作
,并且是覆盖索引
的,则优化器会进行选择。 - 聚集索引是
顺序读
,辅助索引是离散读
。 - 对于
不能进行索引覆盖
的情况,优化器选择辅助索引的时候,查找的数据是少量
的;如果数据量占整表的百分之20
以上,会使用聚集索引,因为顺序读效率远远大于离散读。 - 如果一条SQL语句可以选择的索引非常多,这时优化器选择执行计划时间的开销可能会大于SQL语句本身。这时候可通过
Index Hint
来强制使优化器不进行各个执行路径的成本分析,直接选择指定的索引来完成查询。 USE INDEX
只是告诉优化器可以选择该索引,实际上优化器还是会再根据自己的判断进行选择。而FORCE INDEX
则是强制让优化器使用某个索引。Multi-Range Read
多范围读(MRR), 它的作用针对基于辅助/第二索引的查询,减少随机IO,并且将随机IO转化为顺序IO,提高查询效。MySQL 将根据辅助索引获取的结果集根据主键
进行排序,将乱序化为有序,可以用主键顺序访问基表,将随机读转化为顺序读,多页数据记录可一次性读入或根据此次的主键范围分次读入,以减少IO操作,提高查询效率。Index Condition Pushdown
优化是指在查询索引的时候就进行WHERE
条件的判断(存储引擎层面筛选),不使用ICP是取出数据,在Server层筛选,前提是索引覆盖了查询条件的一部分。Extra里有Using index condition说明使用了ICP。自适应哈希
只能用于等值
的情况,范围查找不能使用自适应哈希。全文检索
使用倒排索引
来实现。在辅助表中存储单词与单词自身在一个或多个文档中所在位置之间的映射。通常用关联数组
实现,有两种表现形式:1.inverted file index
,{单词,单词所在文档的id}。2.full inverted index
,{单词,单词所在文档的id,在具体文档中的位置}。- 全文索引不支持没有
单词界定符
的语言,如中文,日语,韩文等。
《MySQL技术内幕 InnoDB存储引擎》阅读小记二
最新推荐文章于 2023-04-24 09:36:16 发布