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也支持全文索引,这是一种基于分词创建的索引,可以支持复杂的查询