Mysql InnoDB笔记(3)——索引

本文笔记摘自于《Mysql 技术内幕 InnoDB存储引擎》

Mysql InnoDB笔记(1)——体系架构
Mysql InnoDB笔记(2)——表
Mysql InnoDB笔记(3)——索引
Mysql InnoDB笔记(4)——锁
Mysql InnoDB笔记(5)——事务
Mysql InnoDB笔记(6)——备份和性能调优


索引

B+树

先理解B+树的数据结构和算法https://www.jianshu.com/p/7411f7ff0978

B+树索引

  • 聚集索引(clustered index)
    聚集索引是使用表主键构建的一棵B+树,叶子结点就是数据页,存放用户数据。数据页之间通过双向链表相互连接。聚集索引并不是物理上连续,而是逻辑上连续。

按索引查找用户数据时,只能查到某一条记录在某一个页里,具体在页里的什么位置是不知道的。InnoDB会把整个页加载到内存里,然后使用二分法查找到具体的行记录。

  • 辅助索引(secondary index)
    辅助索引也称非聚集索引,叶子结点存放的是聚集索引的主键值。

通过辅助索引查询数据时,先在辅助索引遍历得到主键的值,然后再到聚集索引遍历得到目标数据所在的页,再在页内二分查找得到行记录。

了解一下B+树索引的分裂

关于B+树索引操作的一些技术

  • FIC(Fast Index Creation)
    Mysql5.5版本之前 ,

    对于聚集索引的添加和删除需要经历以下几个步骤:
    创建一张临时表,表结构为通过命令ALTER TABLE新定义的结构;
    把原表数据导到临时表;
    删除原表;
    把临时表重命名为原表。
    这个过程,数据库服务是不可用的。

    对于辅助索引,则会使用FIC的方式:
    只对原表加S锁,不重建表,不影响其他线程读取数据,只会影响DML操作。因此, 相对来说,性能有所提升。

  • OSC(Online Schema Change)
    由Facebook开发的一种在线执行DDL的方式 ,过程比较复杂。简单来说,就是新建一张表,在新表执行DDL操作,将原表数据转移到新表,同时记录在转移过程中对原表的DML操作,转移完成后,在新表执行原表的DML操作,最后交换表名。

  • Online DDL
    Mysql5.6版本开始支持Online DDL。执行过程就是:在创建或删除索引的时候,将对原表的DML操作日志写到缓存中,等索引操作完成后,将DML重做到原表上。

innodb_online_alter_log_max_size配置缓存的大小

了解一下SHOW INDEX FROM table_name;Cardinality

关于B+树索引的一些应用

  • 联合索引

对于联合索引idx_ab(a,b)
select * from tb_test where a=1;select * from tb_test where a=1 and b=2;都是走索引的,而select * from tb_test where b=2;却不走

对于联合索引idx_ab(a,b),a相同的情况下,b是已经排好序的

  • 覆盖索引
    Mysql5.0及以下版本不支持。覆盖索引就是在辅助索引就可以直接查到所需要的列,而不需要去聚集索引再查一次。因为辅助索引叶子结点保存的就是所有的索引列。

比如tb_testidx_a(a),idx_b(b),select count(*) from tb_test where a=1;select a,b from tb_test where a=1;都是直接从辅助索引里拿到数据

  • 索引提示
    使用FORCE INDEX强制使用索引,如:select * from tb_test FORCE INDEX(a) where a=1;

  • MRR(Multi-Range Read)优化
    Mysql5.6版本开始支持,MRR优化的目的是:减少磁盘的随机访问,并将随机访问转化为较为顺序的数据访问。可适用于range,ref,eq_ref类型的查询。
    主要思路就是:从辅助索引查询到叶子结点的键值时,将它们放到缓存里,按RowID排序,然后再按RowID顺序读取数据。
    或者,对于联合索引,拆分键值对,同时对键和值判断,减少拉取的数据。如idx_ab(a,b),select * from tb_test where a=1 and b=2;a和b的条件一起过滤,而不是先取出a=1的数据,再过滤b=2的数据。

通过参数optimizer_switch='mrr=on,mrr_cost_based=off'启用MRR

  • ICP(Index Condition Pushdown)优化
    Mysql5.6版本开始支持,原理:进行索引查询时,先根据索引查找记录,再根据where后面的条件 ,过滤掉部分无效的数据,减少对上层sql的fetch。可适用于range,ref,eq_ref,ref_or_null类型的查询。
  • AHI(自适应哈希索引)

可以通过参数innodb_adaptive_hash_index来启用或禁用AHI

全文检索

全文检索,Full-Text Search,简称:FTS。这个貌似用的比较少,适用于单词的模糊匹配,但只支持英文。

一些概念:倒序索引、FTS Index Cache、stopword列表


上一篇:Mysql InnoDB笔记(2)——表
下一篇:Mysql InnoDB笔记(4)——锁

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值