今日突然对于数据结构和索引感兴趣,所以研究了下mysql数据库,
参考书籍:MySql技术内幕--InnoDB存储引擎(Insinde Mysql:InnoDB Storage Engine)
参考文章:MySQL背后的数据结构和算法 http://www.cnblogs.com/rollenholt/articles/2424531.html
目录:
1. MySQL体系结构
2. MySQL索引结构(MyISAM、InnoDB) -- B+Tree
3. 索引使用策略及优化
1. MySQL体系结构
如下图所示,MySQL由以下几部分组成:
- 连接池组件
- 管理服务和工具组件
- SQL接口组件
- 查询分析器组件
- 优化器组件
- 缓冲(Cache)组件
- 插件式存储引擎
- 物理文件
2. MySQL索引结构
目前MySQL常用的存储引擎主要是MyISAM和InnoDB这两种。
- MyISAM采用的是B+Tree索引结构,叶子节点存储数据存放的位置,采用非聚集索引
- InnoDB采用的是B+Tree所有结构,叶子节点存储的是数据,节点与节点之间采用的是双链表进行连接,采用的是聚集索引,因为在InnoDB中数据顺序已经排列好了,当需要添加其他索引的时候,可以使用辅助索引(非聚集索引),其也是使用B+Tree,叶子节点记录的是聚集索引的键值,所以当从辅助索引进行查找时,需要先查找辅助索引,再查找聚集索引。 在page的缓存中使用Hash来寻找需要的Page,InnoDB的缓冲池大多是用LRU来进行调度的。
具体的索引结构可以参考 MySQL背后的数据结构和算法http://www.cnblogs.com/rollenholt/articles/2424531.html,这篇Blog中详细介绍了B-Tree与B+Tree,及B+Tree在MyISAM、InnoDB中的应用,和怎样合理的建立索引
3. 索引使用策略及优化
建立索引(联合索引)需要考虑到:
- 字段顺序
- 某一字段数据的重复程度,过大,则不宜建立索引
- 最左前缀原理
- 使用explain进行查看是否走了索引
具体可以参考 MySQL背后的数据结构和算法http://www.cnblogs.com/rollenholt/articles/2424531.html