第七章 索引与触发器 v1.0
一、索引相关语法
- 主键索引(Primary key):特殊的唯一索引,非空且唯一。
- 唯一索引(Unique index):限制索引列中的值必须唯一,但允许为空值。
- 全文索引(Fulltext index):使用倒排索引进行存储,适合按照单词进行全文检索,但不支持没有单词界定符的语言,如中文、日语和韩语等。
- 普通索引(Index):没有额外限制,主要用于提高查询速度。
使用全文索引时,可以执行如下查询:
sql
SELECT *
FROM documents
WHERE MATCH(content) AGAINST ('keyword');二、索引底层原理
1.B树(多路查找树)

2.B+树(MySQL实际使用)

B树与B+树的区别:
- 若需要随机查找,二者查找方式相同,不过 B+ 树需要到叶子结点才能提供实际记录的访问。
- B树若需要按顺序查找,需要多次经过分支节点;B+树可以通过指针遍历所有关键字。
- B+树更适合范围查询,能够在叶子结点按照顺序找到符合范围的所有记录。
3.联合索引

- 最左匹配原则:如索引
ABC,支持A、AB、ABC几种组合走索引进行查找。 - 索引字段查询应尽量出现在
WHERE条件中;当WHERE条件使用OR时,索引可能无法生效。
4.页分裂
由于在 B+ 树索引中,当一个索引页已经满了,后续新增的数据可能位于之前节点的中间,插入时 MySQL 需要进行页分裂操作,为新的键腾出空间。这会带来额外开销,例如磁盘 I/O 和索引重建。
因此 MySQL 中通常建议使用整型自增主键,尽量让新增数据追加到后面,减少数据页分裂。
三、触发器
1.创建触发器
sql
CREATE TRIGGER [IF NOT EXISTS] `触发器名` <BEFORE|AFTER> <INSERT|UPDATE|DELETE>
ON `表名` FOR EACH ROW
BEGIN
<触发器主体>
END;<BEFORE|AFTER>:表示触发器是在激活语句之前还是之后触发。<INSERT|UPDATE|DELETE>:表示触发事件的类型。<触发器主体>:触发器激活时执行的 SQL 语句,执行多个语句时使用BEGIN...END。OLD和NEW在触发器中分别代表旧数据和新数据。UPDATE可以使用二者,INSERT只能使用NEW,DELETE只能使用OLD。
2.修改与删除触发器
触发器不能直接更新或覆盖。修改触发器时,需要先删除,再重新创建。
sql
DROP TRIGGER [IF EXISTS] [数据库名] `触发器名`;
SHOW TRIGGERS;