Maria DB - 分别为每个 uniq 索引列建立索引是否有意义?

ODe*_*lta 3 mysql mariadb index select

我们正在运行 10.2.44-MariaDB-log MariaDB 服务器。现在我正在创建具有这种结构的表

Primary('id')
UniqueIndex('colA', 'colB', 'colc');
Index('cola')
Index('colb')
Index('colc')
Run Code Online (Sandbox Code Playgroud)

我想知道,为每一列设置这些索引是否有意义?这些列可以像Select cola或一样合法地查询JOIN ON cola,但是服务器是否知道在这些情况下使用索引,或者它是否使用唯一索引,因为这些列已经在那里了?

Bil*_*win 5

我假设您使用的是默认存储引擎 InnoDB。

各个列上的索引colb可以colc在对这些列进行搜索的查询中使用。三列索引不能用于此类查询:

SELECT ... WHERE colb = ?

SELECT ... WHERE colc = ?
Run Code Online (Sandbox Code Playgroud)

上的索引与三列上的唯一索引几乎cola​​是冗余的,但并不完全冗余。原因是 InnoDB 二级索引隐式地将主键附加到您命名的列上。所以你确实有索引,就像你按如下方式定义它们一样:

Primary(`id`)
UniqueIndex(`colA`, `colB`, `colc`) with extra `id`
Index(`cola`, `id`)
Index(`colb`, `id`)
Index(`colc`, `id`)
Run Code Online (Sandbox Code Playgroud)

唯一索引中的id不用于唯一性,但它存在于二级索引中。

现在假设您有这样的查询:

SELECT ... WHERE cola = ? ORDER BY id
Run Code Online (Sandbox Code Playgroud)

它将能够使用 上的索引colaid并保证排序顺序是无操作的,因为该索引中的顺序id。因此它避免了文件排序的需要。

但是, cola,上的唯一索引不具有相同的排序顺序,因此需要文件排序。colbcolcORDER BY id