索引 - 介绍 ¶
作者: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实现中文搜索吧)