mysql索引优化

1. 百万级的数据

查找数据: 意味着对磁盘进行频繁的操作,索引的目的就是减少操作的次数。来提高查询的效率。

不加索引: 对磁盘进行百万次的io操作

加索引: 将排好序的数据放在数据结构里

举例; select * from tab where colname = 89

(不加索引就得是全表查询)

 

加索引:

索引结构:

二叉树;

    34

    /\ 

    22       89

          /\         /\

      5 23      77 91

如果索引的字段是有序的,二叉树就变成单边增长的趋势(io的次数跟没加索引一样)。

0x0 col1 col2

 

引出:红黑树

它的特性会使出现自平衡。(左旋转, 右旋转, 变色)

会将io的次数降低;

红黑树参考:http://www.360doc.com/content/18/0904/19/25944647_783893127.shtml

 特性如下:

左旋转和右旋转和变色,来保证自平衡:

 

 

mysql的索引引擎是innoDB,

底层的数据结果是B+树,B+树是增强型的多路搜索树。

 

B+树的磁盘读写代价更低 
B+树的内部结点并没有指向关键字具体信息的指针。因此其内部结点相对B 树更小。如果把所有同一内部结点的关键字存放在同一盘块中,那么盘块所能容纳的关键字数量也越多。一次性读入内存中的需要查找的关键字也就越多。相对来说IO读写次数也就降低了。 
举个例子,假设磁盘中的一个盘块容纳16bytes,而一个关键字2bytes,一个关键字具体信息指针2bytes。一棵9阶B-tree(一个结点最多8个关键字)的内部结点需要2个盘快。而B+树内部结点只需要1个盘快。当需要把内部结点读入内存中的时候,B 树就比B+树多一次盘块查找时间(在磁盘中就是盘片旋转的时间)。

B+树的查询效率更加稳定 
由于非终结点并不是最终指向文件内容的结点,而只是叶子结点中关键字的索引。所以任何关键字的查找必须走一条从根结点到叶子结点的路。所有关键字查询的路径长度相同,导致每一个数据的查询效率相当。

B+树和B-树的区别

B+树 
性质:B+树是B-树的变体,也是一种多路搜索树: 
  1.其定义基本与B-树同,除了:

  2.非叶子结点的子树指针与关键字个数相同;

  3.非叶子结点的子树指针P[i],指向关键字值属于[K[i], K[i+1])的子树(B-树是开区间);

  4.为所有叶子结点增加一个链指针;

  5.所有关键字都在叶子结点出现;

B-树 
性质:是一种多路搜索树(并不是二叉的)

posted @ 2019-07-14 19:43  real汪磊  阅读(116)  评论(0编辑  收藏  举报