索引,在我们的mysql中的也叫key,是存储引擎中用于快速找到记录的一种数据结构。这是索引的基本功能,当然,索引还有一些别的属性。但是《高性能mysql》这本书上并没有讲清楚一个事情,那就是索引和主键的区别。主键一定是唯一性索引,唯一性索引并不一定就是主键。我来来具体的东西说吧,书大家都看过吧,看下它每页是不是有个页码,我们的数据表主键就相当于是这个页码。索引相当于书的目录,有了目录我们可以很快的知道这本书的基本内容和结构,数据索引也一样,它可以加快数据表的查询速度。
索引对于良好的性能特别关键,尤其是当表中的数据量越来越大的时候,索引对于性能的影响愈发重要。在数据量小并且负载比较低的时候,不恰当的索引对性能的影响可能还不是太明显,但是当数据量增大的时候,性能会急剧地下降。
在mysql中,我们看看究竟是如何使用索引的,先看看一条sql语句:
select firsr_name from student where student_id = 5
如果我们在student_id列上有建索引,则mysql将使用该索引找到student_id为5的列,也就是说,mysql先在索引上按值进行查找,然后返回所有包含该值的数据行。
索引中可以包含一个或者多个的列,如果索引包含多个列,那么列的顺序也是非常重要的。因为mysql只能高效地使用索引的最左前缀列,创建一个包含两个列的索引,和创建两个只包含一列的索引是大不相同的。
ORM中的索引
我们知道,现在多种语言都封装了ORM,节省了很多我们数据库查询的成本。ORM工具能够产生符合逻辑的,合法的查询,但是它很难生成适合索引的查询。待补充
索引的类型
索引有很重类型,可以为不同的场景提供更好的性能。我们先来看看mysql支持的索引类型,以及他们的优缺点。索引归根结底,是一个查找的问题。
先来看看B-tree索引,人们谈论索引的时候,如果没有特别指明的类型,我们一般指的是B-tree索引,它使用B-tree这种数据结构来存储数据。关于B-tree的概念,我会在数据结构与算法的章节中着重去回顾和理解。这里只是简要的说一说B-tree在我们的数据库中应该如何去使用。B-tree索引能够加快访问数据的速度,因为存储引擎不再需要进行全表的扫描来获取需要的数据。取而代之的是从索引的根结点进行搜索。根节点的槽中存放了指向子节点的指针,存储引擎根据这些指针向下查找。通过比较节点页的值和要查找的值可以找到合适的指针进入下层子节点,这些指针实际上定义了子节点中值的上限和上限。最终存储引擎要么是找到对应的值,要么记录不存在。叶子节点比较特别,它们的指针指向的是被索引的数据,而不是其他的节点页。
好,让我们来创建一个table,看看B-tree到底是怎么存储的。