我试图理解MySQL中的索引.我知道在表中创建的索引可以加快执行查询速度,并且可以减慢行的插入和更新速度.
创建索引时,我在名为authors的表上使用此查询,该表包含(AuthorNum,AuthorFName,AuthorLName,…)
Create index Index_1 on Authors ([What to put here]);
我知道我必须列一个列名,但哪一个?
索引是数据库中的独特数据结构,是数据冗余.其主要目的是通过逻辑排序提供索引数据的有序表示,该逻辑排序独立于物理排序.我们使用双向链表和称为平衡搜索树(B树)的树结构来完成此操作. B树很好,因为它们可以对数据进行排序,并允许在对数时间内进行搜索,访问,插入和删除.由于双向链表,我们可以根据需要在索引上轻松地向后或向前查找各种查询.插入变得简单,因为我们只需重新排列指向不同数据的指针.数据库使用这些双向链表来连接叶节点(通常在B树或B树中),每个叶节点存储在页面中,并在叶节点之间建立逻辑排序. UPDATE或INSERT之类的操作变慢,因为它们实际上是文件系统中的两个写操作(一个用于表数据,一个用于索引数据).
用WHERE定义最佳索引
要定义最佳索引,您不仅必须了解索引的工作方式,还必须了解应用程序如何查询数据.例如,您必须知道WHERE子句中出现的列组合.
对LAST_NAME和FIRST_NAME列的查询的常见限制是区分大小写.例如,我们不想像Hotinger那样进行精确搜索,而是希望匹配所有结果,例如HoTingEr等.这在WHERE子句中很容易做到:我们只说WHERE UPPER(LAST_NAME)= UPPER(‘Hotinger’)
但是,如果我们定义LAST_NAME和查询的索引,它实际上会运行全表扫描,因为查询不在LAST_NAME上,而是在UPPER(LAST_NAME)上.从数据库的角度来看,这是完全不同的.因此,在这种情况下,您应该在UPPER(LAST_NAME)上定义索引.
索引不一定必须是一列.例如,如果主键是一个复合键(由多列组成),它将创建一个连接索引,也称为组合索引.请注意,连锁索引的排序对其可用性和可伸缩性有重大影响,因此必须谨慎选择.基本上,排序应该与WHERE子句中的排序方式相匹配.
用LIKE定义最佳索引
通配符的位置产生巨大的差异. LIKE子句仅在树遍历期间使用通配符之前的字符;其余的不会缩小扫描的索引范围. LIKE子句的前缀越具有选择性,扫描索引就越窄.这使索引查找更快.作为提示,请避免使用带有“%OTINGER%”等通配符的LIKE子句.对于全文搜索,MysqL提供MATCH和AGAINST关键字.从MysqL 5.6开始,您可以拥有全文索引.请查看MysqL的Full-Text Search Functions,以便对索引这些结果进行更深入的讨论.