想象一下,你正在图书馆寻找一本关于 MySQL 索引的书。图书馆里有成千上万本书,但没有目录。你只能一排一排、一本一本地找,直到找到你想要的书。这将会花费大量的时间!数据库索引就像图书馆的目录一样,可以帮助数据库系统快速定位到所需数据,从而大大提高查询速度。
索引是一种特殊的数据结构,它存储了表中一列或多列的值以及对应行的物理地址。当数据库执行查询时,会首先在索引中查找符合条件的记录地址,然后再根据地址直接访问数据行,从而避免了全表扫描,提高了查询效率。
示例:
假设我们有一个名为 users 的表,包含以下数据:
id | name | |
|---|---|---|
1 | 张三 | zhangsan@example.com |
2 | 李四 | lisi@example.com |
3 | 王五 | wangwu@example.com |
如果我们在 name 列上创建索引,数据库就会创建一个索引结构,其中包含 name 列的值和对应行的 id:
name | id |
|---|---|
张三 | 1 |
李四 | 2 |
王五 | 3 |
当我们执行查询 SELECT * FROM users WHERE name = '李四' 时,数据库会首先在索引中找到 name 为 '李四' 的记录,然后直接访问 id 为 2 的行,而不需要扫描整个 users 表。
MySQL 支持多种类型的索引,常见的包括:
优点:
缺点:
可以使用 CREATE INDEX 或 ALTER TABLE 语句来创建索引:
CREATE INDEX index_name ON table_name (column_name);示例:
CREATE INDEX idx_name ON users (name);ALTER TABLE table_name ADD INDEX index_name (column_name);示例:
ALTER TABLE users ADD INDEX idx_email (email);可以使用 DROP INDEX 或 ALTER TABLE 语句来删除索引:
DROP INDEX index_name ON table_name;示例:
DROP INDEX idx_name ON users;ALTER TABLE table_name DROP INDEX index_name;示例:
ALTER TABLE users DROP INDEX idx_email;前面我们已经了解了索引的基本概念,现在让我们更深入地探讨 MySQL 索引的底层实现原理,以及使用索引和不使用索引在性能上的巨大差异。
MySQL 索引的底层数据结构主要有两种:B+Tree(多路平衡搜索树) 和 哈希表。我们平常所说的索引,如果没有特别指明,都是指默认的 B+Tree 结构组织的索引。
B + Tree(多路平衡搜索树)结构介绍,如图所示:

B+Tree结构:
为了更好地理解使用索引带来的性能提升,我们来看一个具体的例子。
假设我们有一个包含 100 万条数据的 users 表,其中 name 列没有创建索引。
场景一:不使用索引
SELECT * FROM users WHERE name = '张三';当执行这条 SQL 语句时,MySQL 数据库需要遍历整个 users 表,逐行比较 name 列的值是否等于 '张三',直到找到匹配的行。这种方式被称为全表扫描,效率非常低下,尤其是在数据量非常大的情况下。
场景二:使用索引
CREATE INDEX idx_name ON users (name);
SELECT * FROM users WHERE name = '张三';当我们在 name 列上创建了索引之后,再次执行相同的查询语句,MySQL 数据库会直接使用索引进行查找。由于 B+ 树的特性,查找速度非常快,只需要很少的 I/O 操作就可以定位到目标数据。
总结:
使用索引可以避免全表扫描,大大提高查询效率,尤其是在数据量非常大的情况下。
虽然索引可以提高查询效率,但在某些情况下,索引可能会失效,导致 MySQL 数据库无法使用索引进行查询,从而进行全表扫描。
常见的索引失效的情况包括:
索引是 MySQL 数据库中非常重要的一个概念,合理地使用索引可以大大提高数据库的查询效率。在设计和使用索引时,需要根据实际情况选择合适的索引类型,并尽量避免索引失效的情况。
以上就是关于数据库中索引的相关知识,希望对各位看官有所帮助,下期见,谢谢~