MySQL 中具有未使用索引列的多列索引行为
Multi-Column Index Behavior in MySQL with Unused Index Column
假设我在 MySQL 数据库中的 table 上定义了以下索引:
(col1, col2, col3)
我知道我在 (col1)
、(col1, col2)
和 (col1, col2, col3)
上获得了索引搜索功能。
我还能在 (col1, col3)
上获得索引搜索功能吗?
从评论中总结 Marc B 的回答:
您无法通过索引 (col1, col2, col3)
在 (col1, col3)
上获得完整的索引搜索功能;但是,您仍然可以从查询的 col1
部分的第一级匹配中获得具有索引搜索功能的 (col1)
索引的好处。然后将在 col3
.
上使用 table 扫描
如果需要在 (col1, col3)
上具有完整的索引搜索功能(可能不需要 - 请参阅 Eugen Rieck 的评论),您需要在 (col1, col3)
.[=17= 上建立单独的索引]
这是我使用 MSSQL 的经验,所以请使用 MySQL
进行测试
考虑 (col1, col2, col3) 的复合索引
您在以下位置进行索引查找:
col1
col1 & col2
col1 & col2 & col3
在 col2 和 col3 上你可以获得索引(不是 table)扫描。
由于索引小于 table,这有助于搜索时间。
有时这是一个重大影响。
对 col1 和 col3 的搜索(希望)是对 col1 的索引查找和对 col3 的索引扫描。
请注意,如果 table 很小,您只会得到一些默认计划
需要加载一些数据来测试
假设我在 MySQL 数据库中的 table 上定义了以下索引:
(col1, col2, col3)
我知道我在 (col1)
、(col1, col2)
和 (col1, col2, col3)
上获得了索引搜索功能。
我还能在 (col1, col3)
上获得索引搜索功能吗?
从评论中总结 Marc B 的回答:
您无法通过索引 (col1, col2, col3)
在 (col1, col3)
上获得完整的索引搜索功能;但是,您仍然可以从查询的 col1
部分的第一级匹配中获得具有索引搜索功能的 (col1)
索引的好处。然后将在 col3
.
如果需要在 (col1, col3)
上具有完整的索引搜索功能(可能不需要 - 请参阅 Eugen Rieck 的评论),您需要在 (col1, col3)
.[=17= 上建立单独的索引]
这是我使用 MSSQL 的经验,所以请使用 MySQL
进行测试考虑 (col1, col2, col3) 的复合索引
您在以下位置进行索引查找:
col1
col1 & col2
col1 & col2 & col3
在 col2 和 col3 上你可以获得索引(不是 table)扫描。
由于索引小于 table,这有助于搜索时间。
有时这是一个重大影响。
对 col1 和 col3 的搜索(希望)是对 col1 的索引查找和对 col3 的索引扫描。
请注意,如果 table 很小,您只会得到一些默认计划
需要加载一些数据来测试