MySQL分组索引和单一索引有什么区别

What is the difference between MySQL grouped indexes and single indexes

在PHP管理中检查我的索引时,我发现了一些分组索引和一些单一索引。
1)我的索引是例如post_status 索引两次?
2) 如果是这样,最好删除哪一个?群发还是单发?

见截图:

来自 Multiple-column index

MySQL can use multiple-column indexes for queries that test all the columns in the index, or queries that test just the first column, the first two columns, the first three columns, and so on. If you specify the columns in the right order in the index definition, a single composite index can speed up several kinds of queries on the same table.

所以如果你的过滤条件包括所有列,最左边一列,最左边两列等等,那么你的type_status_date索引将被使用,例如

SELECT * FROM your_table WHERE 
   post_type=a_constant_value1 AND
   post_status=a_constant_value2 AND
   post_date=a_constant_value3 AND
   post_author=a_constant_value4 AND
   id=a_constant_value5;  

SELECT * FROM your_table WHERE 
   post_type=a_constant_value1 AND
   post_status=a_constant_value2 AND
   post_date=a_constant_value3 AND
   post_author=a_constant_value4;

SELECT * FROM your_table WHERE 
   post_type=a_constant_value1 AND
   post_status=a_constant_value2 AND
   post_date=a_constant_value3;

SELECT * FROM your_table WHERE 
   post_type=a_constant_value1 AND
   post_status=a_constant_value2;

SELECT * FROM your_table WHERE 
   post_type=a_constant_value1;

因此 post_type 列的 post_type 索引是冗余索引,因此可以将其删除。 type_status_date 索引中的 id 列也是冗余的,因为 id 列是主键。您可以删除 type_status_date 索引中的 'id' 列。

如果您从不在任何查询中使用所有列,请删除所有未使用的列。

但是下面的查询将无法使用 type_status_date 索引,因为 post_status 不是 type_status_date 索引中最左边的列。对于此查询,将使用 post_status 索引。

SELECT * FROM your_table WHERE 
   post_status=a_constant_value1;

1) 我的索引是post_status 索引两次?

post_status 索引不是多余的。没有任何其他索引以 post_status 作为前导列。

但是 post_type 索引是多余的。

post_type 栏是(用你的话来说)"indexed twice"。

它是两个索引中的前导列:post_typetype_status_date

2) 如果是这样,最好删除哪一个?群发还是单发?

如果任何查询使用 type_status_date 复合索引,则要删除的索引将是单个列 post_type.

上的索引