在本课中,我们将深入了解MySQL中的索引,包括:
知识点: B+树是MySQL索引使用的数据结构,特别是InnoDB引擎的默认索引类型。
代码示例和输出效果:
无代码示例,因为B+树是后台数据结构,不过可以通过可视化工具或相关软件辅助理解其工作原理。
知识点: 索引应针对查询中的WHERE子句、JOIN操作或ORDER BY子句中的列来创建。
代码示例:
SELECT * FROM orders WHERE customer_id = 10 ORDER BY order_date DESC;
预计输出效果:
这个查询会受益于customer_id
和order_date
的索引。
知识点: 当列是文本类型时,可以使用前缀索引来减少索引大小。
代码示例:
ALTER TABLE articles ADD INDEX idx_title (title(10));
预计输出效果:
这会在articles
表的title
列的前10个字符上创建索引。
知识点: 当一个索引包含所有需要查询的字段时,我们称之为覆盖索引。
代码示例:
SELECT id, username FROM users WHERE username = 'johndoe';
-- 假设我们已经在username上有索引
预计输出效果:
如果username
索引包含了id
字段,该查询就会使用覆盖索引,因为不需要回表查询数据。
知识点: 聚簇索引决定了表中数据的物理顺序,而非聚簇索引则不会影响物理顺序。
代码示例和输出效果:
通常聚簇索引是由表的主键自动创建的,在InnoDB存储引擎中,聚簇索引和数据行本身是存放在一起的。
知识点: 在组合索引中,MySQL查询优化器会从左到右使用索引列。
代码示例:
-- 假设有一个组合索引 idx_first_last (first_name, last_name)
SELECT * FROM users WHERE first_name = 'John' AND last_name LIKE 'D%';
预计输出效果:
这个查询会有效利用idx_first_last
索引,因为它遵循了最左前缀原则。
EXPLAIN
分析查询性能。解析:
ALTER TABLE articles ADD INDEX idx_text_content (content(100));
EXPLAIN SELECT * FROM articles WHERE content LIKE 'MySQL%';
分析EXPLAIN
的输出结果,看是否利用了前缀索引。
SELECT username FROM users WHERE username = 'johndoe';
解释:因为查询仅需要username
列,如果username
列上有索引,则查询操作只需要访问索引,而不需要回到数据表中获取数据,形成覆盖索引。
ALTER TABLE users ADD INDEX idx_age (age);
EXPLAIN SELECT * FROM users WHERE age = 30;
ALTER TABLE users ADD INDEX idx_name_age (first_name, last_name, age);
设计查询:
EXPLAIN SELECT * FROM users WHERE first_name = 'Jane' AND age = 25;
分析查询计划,注意age
列虽然在索引中,但由于不遵循最左前缀原则(跳过了last_name
),它可能不会被使用。
通过这些练习,你将能够深入理解和实践MySQL索引的高级概念和应用。