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
,但是服务器是否知道在这些情况下使用索引,或者它是否使用唯一索引,因为这些列已经在那里了?
我假设您使用的是默认存储引擎 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)
它将能够使用 上的索引cola
,id
并保证排序顺序是无操作的,因为该索引中的顺序id
。因此它避免了文件排序的需要。
但是, cola
,上的唯一索引不具有相同的排序顺序,因此需要文件排序。colb
colc
ORDER BY id