MrC*_*arp 5 mysql sql indexing
我试图理解MySQL中的索引.我知道在表中创建的索引可以加快执行查询速度,并且可以减慢行的插入和更新速度.
在创建索引时,我用一个表此查询称为authors包含(AuthorNum,AuthorFName,AuthorLName,...)
Create index Index_1 on Authors ([What to put here]);
Run Code Online (Sandbox Code Playgroud)
我知道我必须列一个列名,但哪一个?
当用户查询表或什么时,我是否必须在Where语句中放置要比较的列名?
索引是数据库中的独特数据结构,是数据冗余.其主要目的是通过逻辑排序提供索引数据的有序表示,该逻辑排序独立于物理排序.我们使用双向链表和称为平衡搜索树(B树)的树结构来完成此操作.B树很好,因为它们可以对数据进行排序,并允许在对数时间内进行搜索,访问,插入和删除.由于双向链表,我们可以根据需要在索引上轻松地向后或向前查找各种查询.插入变得简单,因为我们只需重新排列指向不同数据的指针.数据库使用这些双向链表来连接叶节点(通常在B +树或B树中),每个叶节点都存储在一个页面中,并在叶节点之间建立逻辑顺序.操作如UPDATE或者INSERT变慢,因为它们实际上是文件系统中的两个写操作(一个用于表数据,一个用于索引数据).
要定义最佳索引,您不仅必须了解索引的工作方式,还必须了解应用程序如何查询数据.例如,您必须知道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%" 例如全文搜索,MySQL提供MATCH和AGAINST关键字.从MySQL 5.6开始,您可以拥有全文索引.查看MySQL 的全文搜索功能,以便对索引这些结果进行更深入的讨论.