索引 - 介绍

  • 作者:KK

  • 发表日期:2017.3.23


要点速读

索引就相当于书本的目录,有了目录找资料就快很多,不然我们要一页一页地看看是不是我们需要的目标章节,太累了吧


书本的比喻

索引有什么用呢,为了解答一些菜鸟的疑惑所以就啰嗦了一下

通常我们接触到的书本,翻开的前几页都是目录。

比如一本语文书,如果它没有目录的话,老师一讲“请大家翻开《爱迪生》这一篇课文”的时候,糟糕怎么办?你怎么知道《爱迪生》在哪一页?

于是第一时间就会想到翻目录吧,所以目录很重要了吧,这个目录在数据库里也有同样的概念,它就是索引,其实在书籍中,目录和索引是同一种概念

  • 本质上,索引就是将内容的关键摘要记录下来,并在后面附上了“它在第几页”的信息,让我们快速定位到页码

  • 而在数据库里,比如为email字段建立了索引,那么你可以想像有一个很大的邮箱列表,后面记录了这些相关邮箱的记录在磁盘的哪个位置(第几个扇区等)


索引的威力

没有索引的时候,我们翻书就会很辛苦,一页一页地看看哪一页才是《爱迪生》,数据库程序也很辛苦,它在一行一行地if($row['email'] == $query['email'])这样判断,直到判断到有为止,可能在10000行数据中它扫描到第9999行才发现了需要的数据

所以如果我们为email字段建立了索引的话,它就能在这个数据量比较少的索引里快速遍历找到需要的email行索引(实际上不是遍历索引,是用二分查找法来快速找的),然后在这个索引数据里找到对应的磁盘扇区号码,再告诉磁头直奔那个扇区读数据,就不用往整个数据储存的磁盘区大片大片区域地扫了~

希望我这样讲得还可以吧,希望你也能明了吧

一般数据量少的话有没有索引查询速度都差不多,但是当数据行数达到50万甚至100万的时候,在MySql数据库中建立索引,所带来的查询速度提升就会明显感知得到了


4种索引简介

主键索引

每个表中被设为PREMIARY的字段就是主键嘛,而主键都会有一个对应的主键索引,不用我们专门去建立

主键不会冲突,所以主键索引是有唯一特性的,通常我们都将主健命名为“id”,如果WHERE id = 111这样查询,肯定会使用主键索引

此时理论上MySql不是扫描每一行数据看看id字段是不是111,而是先从索引里找找id为111的数据在哪个磁盘扇区,然后直奔那个扇区读数据出来


唯一索引

假设订单表除了主键外还有一个订单号,那这些订单号应该不允许重复的才对,所以就应该为其建立唯一索引了,这样查询时就一旦在索引中找到有这个订单号了就不用再找其它了,因为说好了是唯一的嘛


普通索引

跟唯一索引不同的就是这种索引允许重复的值,比如用户的年龄


全文索引

主要针对大段文本设计的索引,只能搜索英文内容,搜中文内容不行(用Sphinx实现中文搜索吧)