假设我们有一个学生成绩信息表 student:
student_name student_score ···
··· ··· ···
我们要从这个表中查找到名字为xiaoma的学生成绩信息,我们需要用这样的语句:
select * from student
where student_name = 'xiaoma'
在没有建立索引的情况下:
数据库不得不查询student表的每一行的每一列,并确定学生名称是否为xiaoma,这就意味着数据库不得不检索相当大的数据量才能查找成功。
这就是全盘扫描。
1、什么是索引?
一个索引是存储的表中一个特定列的值得数据结构。索引是在表的列上创建。所以,索引包含一个表中列的值,并且这些值存储在一个数据结构中。
索引是一种数据结构。
2、通常可以作为索引的数据结构有哪些?
(1)B-Tree
(2) 哈希表:哈系索引的工作方式是将列的值作为索引的键值(key),和键值相对应实际的值(value)是指向该表中相应行的指针。
3、索引的工作原理:
因为索引基本上是用来存储列值的数据结构,这使查找这些列值更加迅速。如果索引使用最常用
的数据结构 B-Tree,那么其中的数据是有序的。有序的列值可以极大的提升性能。
假设我们在student_name这一列上建立索引。这样我们在查找student_name=xiaoma,不用再扫描全表。因为索引已经按照字母顺序排序,只需查找所有首字母为“x”的列。
这样的查询次数最大为:
(所有首字母为“x”的索引项被存储在一个内存块中)
查询这个内存块所需的次数 + 遍历内存块中所有项所需的次数。
相比较全盘扫描,速度大大加快。
简单的说,索引就是以表中的某一列作为,列值所在
行的唯一标识,进行排序。方便快速查找。
更加形象的说,索引是整张表的目录。
4、在数据库中,索引存储了些什么?
索引存储了,创建索引的表上那一列的值,以及指向
表中相应行的指针。指针指向行所在的位置。
5、当我们设置索引后,一定会使用索引进行查找吗?
不一定,在执行sql语句:
select * from student
where student_name = 'xiaoma
数据库会检查在查询的列上是否有索引。假设student_name列上确实创建了索引,数据库会接着检查使用这个索引做查询是否合理。因为有些场景下,使用索引比起全表扫描会更加低效。