目录


索引

1.什么是数据库索引?

1.1 概念

  • 索引是一种特殊的文件,包含着对数据表里所有记录的引用指针。可以对表中的一列或多列创建索引,并指定索引的类型,各类索引有各自的数据结构实现。

索引(index)可以说是一本书的目录(index)。【两者的英文是同一个只是表现的形式不一样。】

【MySQL】—— 数据库索引 (索引是什么?B树,B+树)_MySQL


1.2 作用

  1. 数据库中的表、数据、索引之间的关系,类似于书架上的图书、书籍内容和书籍目录的关系。
  2. 索引所起的作用类似书籍目录,可用于快速定位、检索数据。
  3. 如果没有索引,在数据库中进行查找就要把整个表遍历一遍,很耗时.
  4. 索引对于提高数据库的性能 (主要是提高查找效率,修改增加删除效率还会有所下降) 有很大的帮助。
  5. 本质上索引就是为了避免数据库进行顺序查找,提高查找效率.

1.3 使用场景

要考虑对数据库表的某列或某几列创建索引,需要考虑以下几点:

  1. 数据量较大,且经常对这些列进行条件查询。
  2. 该数据库表的插入操作,及对这些列的修改操作频率较低。
  3. 索引会占用额外的磁盘空间。(用空间效率换取时间效率)
    满足以上条件时,考虑对表中的这些字段创建索引,以提高查询效率。
    反之,如果非条件查询列,或经常做插入、修改操作,或磁盘空间不足时,不考虑创建索引。

1.4 索引的优缺点

思考一个问题:

树的目录一旦决定了,后续每次对书的内容进行调整时,都可能会印象到目录的准确性,就需要重新调整目录。

数据库的索引也是一样的情况:

当我们 对 数据进行“增删改”操作的时候,往往也需要同步调整索引的结构。

索引带来的好处:提高了查询效率
索引带来的坏处:占用了更多的空间,拖慢了增删查改的速度。


从表面来上看,似乎索引的坏处 比 索引带来的好处要多。但!这不必意味着 弊大于利!!
因为在实际需求的场景中,查询操作往往是最高频率的操作。
相对于“增删改” 的使用频率则低的可怜。
因此,查询作为一个高频操作,索引对其来说是不可缺少

另外,有索引之后对于查询的效率的提升使非常巨大!!!
当MySQL里面的数据量级 达到千万级别的时候(一个表里就有几千万,甚至破亿的数据)再去遍历表,就会非常非常的低效!!!

在另一方面:

MySQL在进行数据比较的时候,不是像我们编程那样,一个for循环(这样的想法是错误的)

编程上的查询是在内存中的比较;MySQL中的比较是在硬盘上比较。
也就是说:在MySQL中的每一次比较都会涉及到硬盘的 IO 操作。


又因为硬盘的 IO 的 访问速度 比 内存 慢 3 ~ 4 个数量级(几千~万倍)。
所以,如果是查询的操作更是慢上加慢!!!
【这里又一次体现了索引的好处:能使这里的查找效率提高数倍】


1.5 如何使用

  • 创建主键约束(PRIMARY KEY)、唯一约束(UNIQUE)、外键约束(FOREIGN KEY)时,会自动创建对应列的索引。

查看索引

命令格式:show index from 表名;

 show index from student;

其作用:查看一个数据表上都有哪些索引

【MySQL】—— 数据库索引 (索引是什么?B树,B+树)_MySQL_02


创建索引

命令格式:

create index 索引名字 on 表名(列名)

【MySQL】—— 数据库索引 (索引是什么?B树,B+树)_B树_03

注意:

创建索引这件事是一个非常低效的事情,尤其是当前表里面已经有很多数据的时候。
它需要给该列的每一行数据都设置一个索引,因此在数据量庞大的情况下,创建的索引的过程是非常耗时的

因此,以后在工作的时候,看到某个数据库的一个表没有索引,千万不要贸然去创建一个索引
你啪的回车一敲,下一秒数据库就挂了。

操作数据库本身就是一个危险操作。必须时刻小心谨慎。


删除某个表中的索引

命令格式:

drop index 索引名字 on 表名

9ea019f4d4e947b4880d189a908c90a6.png

删除索引操作和创建同理,都是非常低效的事情,也容易让数据库挂了