mysql性能优化002-理解mysql底层B+tree索引机制

1.为什么选择B+Tree

  1.二叉树了解  → Indexing  →  Binary Search Trees

  2.平衡二叉树  某一个节点的高度差不会超过1

  3.完全平衡二叉树(AVL Tree) 整个树的高度差不会超过1

  4.为什么不用二叉树

    4.1.二叉树太深了:数据所处的(高)深度决定着IO操作次数,IO操作耗时大

    4.2.1.二叉树太小了:每一个磁盘块(节点/页(一页4K大小))保存的数据量太小了(mysql的一页为16K)

    4.2.2.没有很好的利用操作磁盘IO的数据交换特性,也没有利用好磁盘IO的预读能力(空间局部性原理),从而带来频繁的IO操作

  5.B+Tree(多路平衡查找树)

    5.1.  2-3树了解

    5.2.一个磁盘至少可以保存多少个关键字(若一个关键字4byte+冗余空间约4byte,16k*1024/8)

    5.3.左闭合区间来计算取哪一路数据,非叶子节点不保存数据相关信息,只保存关键字和子节点的引用,关键字对应的数据只保存在叶子节点

    5.4.叶子节点是顺序排列的,并且相邻节点具有顺序引用的关系

    5.5.B+优点: 1.扫库、表能力更强,2.磁盘读写能力更强,3.排序能力更强,4.查询效率更加稳定

2.B+Tree在两大引擎中如何体现

  查看表结构:show create table 表名;

     如:ENGINE = Innodb

  数据存储路径:show variables like 'datadir';

  cd 库

  1.Myisam:数据存储在table.MYD文件中,索引存储在table.MYI中,表定义存储在table.frm中

    多索引时,存在多个索引数据,通过各自的索引查找索引位置,然后通过引用取得相对应的数据

  2.Innodb:数据、索引存储在table.IBD文件中,表定义存储在table.frm中

    多索引时,存在主键索引与辅助索引,查询辅助索引时,通过辅助索引查找到对应的主键,然后通过主键索引查找到主键所在位置的数据

3.索引知识补充

  1.聚集索引:数据库表行中数据的物理顺序与键值的逻辑(索引)顺序相同

  2.列的离散性count(distinct col):离散性越高,选择性越好

  3.联合索引:1.经常用的列优先(最左匹配原则)2.离散度高的列优先,3.宽度小的列优先(最少空间原则)

  4.覆盖索引:如果查询列克通过索引节点中的关键字直接返回,则该索引称之为覆盖索引,覆盖索引可减少数据库IO,将随机IO变为顺序IO,可提高查询性能

4.总结及验证

  1.执行计划语句:explain select * from table;

  2.所用指定的列,少用select * ;

  3.联合索引中如果查询中有某个列的范围查询,则其右边的所有列都无法使用索引;

    如a,b联合索引select * from table where a > 1 and b = 2;只能用到a索引

 

你可能感兴趣的:(mysql,优化,mysql)