我对mySql索引的内部机制并不非常熟悉,但在我熟悉的两个数据库供应商产品(MsSQL、Oracle)中,索引是平衡树(B-Tree)结构,其节点被组织为索引所定义的列的有序元组(按照定义的顺序)。请参阅注释。
所以,除非mySql的做法非常不同(可能不是这样),任何复合索引(多列索引)都可以被需要通过索引进行过滤或排序的查询使用,只要列的列表是兼容的。也就是说,如果这些列按照完整索引的顺序进行排序后,是完整索引列集合的有序子集,且从实际索引序列的开头开始,除了末尾可能有间隔之外,没有其他间隔...
换句话说,这意味着如果你在(a,b,c,d)上有一个索引,过滤条件为(a)、(a,b)或(a,b,c)的查询也可以使用该索引,但需要过滤条件为(b)、(c)、(b,c)或(a,c)的查询将无法使用该索引...
所以在你的情况下,如果你经常需要单独对列
item进行过滤或排序,你需要在该列上添加另一个单独的索引...
注意:通常,使用平衡树这个术语时,暗示着树中的每个节点最多可以有两个子节点或分支。这被称为平衡
二叉树。SQL Server中的索引只是平衡的非二叉B树,其中节点可以有多于两个的子节点或分支。索引优化器根据性能优化计算每个节点分配多少个分支。每个节点存在的子节点越少,树的高度(或深度)就越高。最佳分支数(最大化定位特定记录的性能)取决于总数据集域中索引属性的离散值数量。