Mysql索引总结
Contents
Mysql 索引
- MySQL索引数据结构底层为什么不用二叉树 顺序查找时, 单边增长的列还是全表查询, 没有一丝增长
- MySQL索引数据结构底层为什么不用红黑树(二叉平衡树) 数据越多, 树的高度越大. 即数据量越大查询越慢.
- MySQL索引数据结构底层为什么使用B+Tree
- 首先B Tree与B+Tree的区别是, B Tree节点上的data数据, 挪移到最后层的叶子节点上. 其次, B+Tree比B Tree叶子节点上多了双向指针, 存储了磁盘地址, 方便做范围查询.
- 每次索引查询时, 都会将每层的索引load到内存中进行二分比对, 直到找到data数据, 这样就导致BTree相对于B+Tree会很重, B+Tree找到相应的索引后才会去拉取数据
- 每一页的索引都是做了排序
- 树高控制在3层高度, 每一层叫一页(innodb_page_size), 默认为16KB(大概可以放1170多个元素)
- 为什么不使用红黑树 相对于红黑树, BTree可以压缩树的高度.
- innodb索引的结构有哪些? 分别都有什么优劣
- 有两种, 一种是BTree, 另一种是hash
- Hash速度快, 尤其是等值或者”IN”的时候, 但是有hash冲突的和不支持范围查询的问题;
- 为什么推荐使用Innodb, 为什么推荐使用整形自增主键
- innodb与my在存储结构上的不同决定的, innodb可以按照索引直接查找到数据, My按照索引只能查找到数据的磁盘文件地址, 还要到另一种表中查找数据, 性能上有浪费
- 在索引排序规则下, 使用自增会很方便的在后面新增节点, 相反, 如果不使用自增, 在已经排序完很多节点的情况下, 再插入中间的节点, 会造成索引排序引擎非常大的压力, 又将已经排序好的节点做重新的分裂, 也有可能在根节点做变动.
- MY的主键索引和非主键索引是一样的类型, Innodb的主键索引和非主键索引是不一样的类型, 非主键索引存储的data, 是这张表的聚集索引(一般是主键索引), 这么做是为了一致性和节约空间, 二级索引都是非聚集索引, innodb每张表只有一张聚集索引
- 聚合索引, 使用的是左列前缀, 按照索引建立的前后顺序来做索引排序
Mysql Explain
- 关联查询时要使用主键关联