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-树
性质:是一种多路搜索树(并不是二叉的)