MYSQL 5分钟掌握InnoDB索引(二)

87 阅读2分钟

InnoDB

事务型数据库的首选引擎,支持ACID事务,支持行级锁定。InnoDB是为处理巨大数据量时的最大性能设计。InnoDB存储引擎完全与MySQL服务器整合,InnoDB存储引擎为在主内存中缓存数据和索引而维持它自己的缓冲池。InnoDB存储它的表&索引在一个表空间中,表空间可以包含数个文件(或原始磁盘分区)。这与MyISAM表不同,比如在MyISAM表中每个表被存在分离的文件中。

B+TREE索引

  • 基于B-Tree 改进的 B+Tree索引
    • 冗余索引
    • 只在子节点存放数据,可以存放更多索引
    • 叶子节点双向指针支持高效范围搜索
  • 树的层级低,磁盘I/O次数低

主键索引查找

找到叶子节点的数据,直接返回

辅助索引

  • 叶子节点存放主键信息以及索引字段
  • 欲查找的字段如果是索引字段则直接返回数据,否则用主键进行回表查找

联合索引(左前缀原理)

多个索引联合,查找过程如辅助索引,查找顺序需要与联合索引建立的顺序一致,否则无法使用索引

其它树形结构

二叉搜索树

高度无法控制,容易发生数据倾斜

红黑树

树能平衡,但高度无法控制

哈希

不支持范围查找,需要解决哈希碰撞问题

MyISAM

MyISAM引擎设计简单,数据以紧密格式存储,所以在某些场景下的性能很好。MyISAM有一些服务器级别的性能扩展限制,比如对索引键缓冲区(key cache)的Mutex锁,MariaDB基于段(segment)的索引键缓冲区机制来避免该问题。但MyISAM最经典的性能问题还是表锁问题,如果你发现所有的查询都长期处于“Locket”状态,那么毫无疑问表锁就是罪魁祸首。

加锁与并发

MyISAM对整张表加锁,而不是针对行。读取时会对需要读到的所有表加共享锁,写入时则对表加排他锁。但是在表有读取查询的同时,也可往表中插入新的记录(并发插入,CONCURRENT INSERT)

索引特性

对于MyISAM表,即使是BLOB和TEXT等长字段,也可以基于其前500个字符创建索引。MyISAM也支持全文索引,这是一种基于分词创建的索引,可以支持复杂的查询