您的位置:首页 > 数据库 > MySQL

Mysql索引的优化(1)

2017-08-24 18:40 148 查看
索引对数据的印象非常的关键,索引的主要作用就是告诉存储引擎如何快速的找到我们所需要的数据。当表的数据比较少时,查询的频率也比较低的情况下索引的作用可能还不是太明显,因为这时候表中的数据差不多都可以缓存到内存中。所以就算是全表扫描也不会太慢。而随着表中的数据越来越多,查询频率也越来越高,内存已经不能完全缓存数据的时候,索引的作用就会显得越来越重要。据我了解大多数程序员总是忽略或过多的强调索引的作用就有2种极端的表现一种就是除了主键没有任何索引,另一种就是表中每一列都建立一个索引。其实这两种做法都是不正确的,太多或太少的索引都会对数据库的性能带来不好的影响,只有在正确的链上建立正确的索引才能增强数据库的处理能力,为了能够正确的使用索引我们先看看Mysql支持的索引类型都有那些。
1、Mysql支持的索引类型
上面我说索引的主要作用就是告诉存储引擎如何快速的找到我们所需要的数据。所以Mysql是在存储引擎实现的不是在Mysql的服务层实现的。这就决定了不同的存储引擎不是都支持所有的索引类型。即使是同一种索引在不同的存储引擎上其底层的实现也可能不相同,现在我们先看看Mysql支持的索引类型以及它们的优缺点。
1.1 B-Tree
索引的特点(B+树结构存储数据)
B-Tree索引是最常见的一种索引类型,通常我们所说的索引指的就是B-Tree索引
,它使用了B+树的结构来存储数据,在B+树中每一个叶子节点都包含一个指向下一个叶子节点的指针。这样可以方便的叶子节点的遍历。下面看看B-Tree索引的特点
1.2 B-Tree索引的特点
1.2.1 B-Tree索引以B+树的结构存储数据
对于不熟悉数据结构的同学可能不明白什么是B+树。下面我给个图来说明下B+树的存储结构是什么样子的。

呵呵!毕业多年估计B+树已经还给老师了吧!
其实我也忘了,有兴趣去看大学课程数据结构的书吧!。
 
从这张图中可以看出B+树是一种平衡的查找树,每个叶子节点到根部的距离都是相同的,可以看出所有的节点都是按照键值的大小来顺序存放的,以及各个节点是由指针进行连接的。上面说过索引的好处是可以方便的进行快速查找。这就是典型的B-Tree结构的存储结构。但是对于不同的存储引擎具体实现可能有所不同,比如MyISAM
索引在叶子节点上是通过数据的物理位置来进行引用行的,而InnoDB则是通过主键来引用被索引的行的。
1.2.2 B-Tree索引能够加快数据的查询速度
从上面图中可以看出B-Tree索引能够加快查找速度的,通常情况索引的大小远小于表中数据的大小,使用了B-Tree索引存储引擎就不再需要全表扫描来获取需要的数据了。取而代之的则是从索引的根节点开始进行搜索,在索引的根节点中存放了指向下层子节点的指针,存储引擎根据这个指针向下层进行查找,通过比较节点页的值和要查找的值就会得到合适的指针进入下层的子节点。而这些指针实际上是定义了子节点中值的上限和下限所以呢最终存储引擎要找到对应的值,要么可以确定所查找的值是不存在的,最终存储引擎会通过B-Tree树索引找到符合要求的这个叶子节点。叶子节点比较特别它的指针指向被索引的数据而不是其他的叶子节点,前面说过在InnoDB存储引擎中叶子节点存储的是主键,而在MyISAM中叶子节点指向数据的物理地址。另外由于B-Tree索引对数据是顺序存储的,所以B-Tree索引最后一个特点就是很适合范围查找。
1.2.3 B-Tee索引更适合进行范围查找
所以这一点和Hash索引有很大不同。每当我们建立索引时候就希望,查询想我们所想象的那样来使用这个索引,但是实际情况Mysql有时候并不像我们所希望的那样使用我们所建立的索引。那么这其中就有很多原因。下面我们就来看看在什么情况下用到B树索引
 
1.3
在什么情况下可以用到B树索引
 
1.3.1
全值匹配的查询
就是指和索引中的所有列来进行匹配例如: order_sn = '987632119900' 
。如果我们在订单号order_sn上建立了一个B树索引这时我们要查找订单号为987632119900,这样的一个订单这样就是进行的一个全局匹配的查询。
1.3.2
匹配最左前缀的查询
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: