索引剖析
索引是数据库中不同的数据结构,是数据冗余。其主要目的是通过独立于物理排序的逻辑排序来提供索引数据的有序表示。我们使用双向链表和称为平衡搜索树(B-tree)的树结构来做到这一点。B 树很好,因为它们保持数据排序并允许在对数时间内进行搜索、访问、插入和删除。由于双向链表,我们可以根据需要在索引上轻松地向后或向前进行各种查询。插入变得简单,因为我们只需要重新排列指向不同数据片段的指针。数据库使用这些双向链表来连接叶节点(通常在 B+ 树或 B 树中),每个叶节点存储在一个页面中,并在叶子节点之间建立逻辑顺序。像这样的操作UPDATE
或者INSERT
变慢,因为它们实际上是文件系统中的两个写入操作(一个用于表数据,一个用于索引数据)。
使用 WHERE 定义最佳索引
要定义最佳索引,您不仅必须了解索引的工作原理,还必须了解应用程序如何查询数据。WHERE
例如,您必须知道子句中出现的列组合。
LAST_NAME
查询和列的一个常见限制是FIRST_NAME
区分大小写。例如,与其进行精确搜索,Hotinger
我们更愿意匹配所有结果HoTingEr
,诸如此类。WHERE
这在一个子句中很容易做到:我们只是说WHERE UPPER(LAST_NAME) = UPPER('Hotinger')
但是,如果我们定义一个索引LAST_NAME
和查询,它实际上会运行全表扫描,因为查询不是 onLAST_NAME
而是 on UPPER(LAST_NAME)
。从数据库的角度来看,这是完全不同的。因此,在这种情况下,您应该UPPER(LAST_NAME)
改为定义索引。
索引不一定必须用于一列。例如,如果主键是复合键(由多列组成),它将创建一个连接索引,也称为组合索引。请注意,级联索引的顺序对其可用性和可伸缩性有重大影响,因此必须谨慎选择。基本上,排序应该与WHERE
子句中的排序方式相匹配。
使用 LIKE 定义最佳索引
通配符的位置有很大的不同。 LIKE
子句在树遍历期间只使用通配符之前的字符;其余的不会缩小扫描的索引范围。子句前缀的选择性LIKE
越强,扫描的索引就越窄。这使得索引查找更快。作为提示,请避免 LIKE
使用通配符开头的子句,例如"%OTINGER%"
For full-text search、MySQL 提供MATCH
和AGAINST
关键字。从 MySQL 5.6 开始,您可以拥有全文索引。查看MySQL 的Full-Text Search Functions以获得有关索引这些结果的更深入讨论。