数据库索引🕛

把数据库索引看作是书的索引。如果你有一本关于狗的书,你想要找关于‘黄金猎犬’的那部分。当你可以通过在书背的索引找到哪几页有关于‘黄金猎犬’信息的时候,你为什么要翻完整本书 - 这相当于数据库中的全表扫描。同样的,就像一本书的索引包含页码一样,数据库的索引包含了指针,指向你在SQL中想要查询的值所在的行。使用索引的全部意义就是通过减少一张表中需要查询的记录/行的数目来加快搜索的速度。

平常我们select * from user where name=“nsk”,不用索引是把user表从第一条数据找到最后一条数据,找出所有符合的数据,但是如果在10000条数据中找1条符合的话,也是会查找10000遍,这样的话查询时间会很长。但是如果吧name做成索引,通过索引就能轻松定位。

因为索引基本上是用来存储列值的数据结构,这使查找这些列值更加快速。一般索引是使用B-Tree数据结构,也有使用其他数据结构的比如哈希表索引,索引是一种数据结构。如果索引使用最常用的数据结构B-Tree-那么其中的数据是有序的。有序的列值可以极大的提升性能。下面解释原因。比如刚刚的查找nsk值,建立索引以后会对name列的值进行排序,因为索引已经按照按字母顺序排序。索引已经排序意味着查询一个名字会快很多,因为名字首字母为‘n’的user都是排列在一起的。另外重要的一点是,索引同时存储了表中相应行的指针以获取其他列的数据。

数据库索引是创建在表的某列上的,并且存储了这一列的所有值。但是重点是数据库索引并不存储这个表中其他列(字段)的值。如果我们确实把其他所有字段也存储在个这个索引中,那就成了拷贝一整张表做为索引-这样会占用太大的空间而且会十分低效。

如果我们在索引里找到某一条记录作为索引的列的值,如何才能找到这一条记录的其它值呢?这是很简单 - 数据库索引同时存储了指向表中的相应行的指针。指针是指一块内存区域, 该内存区域记录的是对硬盘上记录的相应行的数据的引用。因此,索引中除了存储列的值,还存储着一个指向列值在行数据的引用。也就是说,索引中的name这列的某个值(或者节点)可以描述为 (“nsk”, 0x82829), 0x82829 就是包含 “nsk”那行数据在硬盘上的地址。如果没有这个引用,你就只能访问到一个单独的值(“nsk”),而这样没有意义,因为你不能获取这一行记录的user的其他值-例如地址(address)和年龄(age)。

建立索引

#建立单个索引
CREATE INDEX name_index ON user (name)
#建立多个索引
CREATE INDEX name_index ON user (name, age)

使用数据库索引也有不好的地方

其一,索引会占用空间 - 你的表越大,索引占用的空间越大。其二,性能损失(值更新操作),当你在表中添加、删除或者更新行数据的时候, 在索引中也会有相同的操作。记住:建立在某列(或多列)索引需要保存该列最新的数据。

基本原则是如果表中某列在查询过程中使用的非常频繁,那就在该列上创建索引。

建立索引前

建立索引后