索引
什么是索引?
索引是一种特殊的文件(InnoDB 数据表上的索引是表空间的一个组成部分),它们包含着对数据表里所有记录的引用指针。索引是一种数据结构。数据库索引,是数据库管理系统中一个排序的数据结构,以协助快速查询、更新数据库表中数据。索引的实现通常使用 B 树及其变种 B+树。
更通俗的说,索引就相当于目录。为了方便查找书中的内容,通过对内容建立索引形成目录。索引是一个文件,它是要占据物理空间的。
索引有哪些优缺点?
索引的优点
• 可以大大加快数据的检索速度,这也是创建索引的最主要的原因。
• 通过使用索引,可以在查询的过程中,使用优化隐藏器,提高系统的性能。
索引的缺点
• 时间方面:创建索引和维护索引要耗费时间,具体地,当对表中的数据进行增加、删除和修改的时候,索引也要动态的维护,会降低增/改/删的执行效率;
• 空间方面:索引需要占物理空间。
索引使用场景
MySQL的索引是用于加快数据库查询速度的一种数据结构。索引可以在查询中提供快速访问数据的能力,减少了数据库的扫描和过滤操作,从而提高了查询性能。以下是一些常见的MySQL索引使用场景:
-
主键索引:主键索引是最基本和常见的索引类型,用于唯一标识表中的每一行数据。主键索引可以提高查询速度,并且还可以确保数据的唯一性。
-
唯一索引:唯一索引用于确保某个或某些列的数值在整个表中是唯一的。唯一索引可以用于加速查找操作,还可以避免插入重复数据。
-
外键索引:外键索引用于实现表之间的关联关系。通过在外键列上创建索引,可以加速关联表的连接查询操作。
-
聚集索引:聚集索引确定了数据在磁盘上的物理顺序,并决定了数据在表中的存储方式。每个表只能有一个聚集索引,通常是主键索引。
-
非聚集索引:非聚集索引是基于表中的某个列或多个列创建的索引,不改变数据在磁盘上的物理顺序。非聚集索引可以加速查询和排序操作。
-
全文索引:全文索引用于在文本字段上进行全文搜索。通过使用全文索引,可以快速查找包含指定关键词的文本内容。
索引的使用场景取决于具体的业务需求和数据库设计。一般来说,当表中的数据量较大,或者某个或某些列经常用于查询或连接操作时,使用索引可以显著提高查询性能。然而,索引也会增加数据的存储空间,并且在插入、更新和删除数据时会导致额外的开销,因此需要根据具体情况进行权衡和优化。
如何创建数据库索引
例如,对于students表:
| id | class_id | name | gender | score |
|---|
如果要经常根据 score列进行查询,就可以对score列创建索引:
ALTER TABLE students
ADD INDEX idx_score (score);
使用 ADD INDEX idx_score (score) 就创建了一个名称为 idx_score,使用列 score 的索引。索引名称是任意的,索引如果有多列,可以在括号里依次写上,例如:
ALTER TABLE students
ADD INDEX idx_name_score (name, score);
索引的效率取决于索引列的值是否散列,即该列的值如果越互不相同,那么索引效率越高。反过来,如果记录的列存在大量相同的值,例如 gender 列,大约一半的记录值是 M,另一半是 F,因此,对该列创建索引就没有意义。
可以对一张表创建多个索引。
删除索引
在 MySQL 中,我们可以通过 DROP INDEX 语句来删除索引。其基本语法如下:
DROP INDEX index_name
ON table_name;
其中,index_name 表示要删除的索引名称,table_name 表示表名称。
例如,我们可以通过以下语句删除 user 表中名为idx_username的索引:
DROP INDEX idx_username
ON user;
使用索引
在 MySQL 中,我们可以在查询语句中使用 WHERE 子句来指定索引列,从而加速查询操作。例如,我们可以使用以下语句查询 user 表中用户名为 Alice 的用户数据:
SELECT *
FROM user
WHERE username = 'Alice';
如果 user 表中有名为 idx_username 的索引,那么 MySQL 就会使用该索引来加速查询操作。