一尘不染

索引和多列主键

mysql

经过搜索,没有找到这个特定的菜鸟问题的答案。如果我错过了,我深表歉意。

在MySQL数据库中,我有一个带有以下主键的表

主键ID(发票,项目)

在我的应用程序中,我也会经常自己选择“项目”,而很少选择“发票”。我假设我将从这些列的索引中受益。

当我定义以下内容时,MySQL不会抱怨:

索引(发票),索引(项目),主键ID(发票,项目)

但是,我没有看到任何证据(使用DESCRIBE-我知道如何查找的唯一方法)为这两列建立了单独的索引。

因此,问题是,构成主键的列是否会自动分别索引?另外,有没有比DESCRIBE更好的方法来探索我的桌子的结构?


阅读 482

收藏
2020-05-17

共1个答案

一尘不染

我不是很熟悉mySql上的索引内部,但是在我熟悉的两个数据库供应商产品(MsSQL,Oracle)上,索引是balance-
Tree结构,其节点被组织为列的顺序元组。索引定义在( 在定义的序列中

因此,除非mySql的操作方式大不相同((可能不是)),只要需要按索引中列的 子集 进行过滤或排序的任何查询,
可以使用任何复合索引(在多个列上)。列列表是兼容的,即,如果列的排序顺序与完整索引中列的排序列表相同,则该列是完整索引列集的有序子集,该索引集从实际索引序列的开头开始,除了最后没有差距…
__

换句话说,这意味着如果在(a,b,c,d)上有索引,则对(a),(a,b)或(a,b,c)进行筛选的查询也可以使用索引,但需要过滤(b)或(c)或(b,c)的查询将无法使用索引…

因此,在您的情况下,如果您经常需要单独对列 项目 进行过滤或排序,则需要单独在该列上添加另一个索引…

2020-05-17