答案 0 :(得分:1)
MySQL可以对测试索引中所有列的查询使用多列索引,或者只测试第一列,前两列,前三列等的查询。如果在索引定义中以正确的顺序指定列,则单个复合索引可以加速同一表上的多种查询。
因此,如果您的过滤条件包括所有列,最左边一列,最左边两列等,则会使用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
索引是冗余索引,因此可以将其删除。 id
索引中的type_status_date
列也是多余的,因为id
列是主键。您可以删除' id' type_status_date
索引中的列。
如果您从未在任何查询中使用所有列,请删除所有未使用的列。
但是后续查询将无法使用type_status_date
索引,因为post_status
不是type_status_date
索引中最左侧的列。对于此查询,将使用post_status
索引。
SELECT * FROM your_table WHERE
post_status=a_constant_value1;
答案 1 :(得分:1)
1)我的索引是否为例如post_status索引两次?
post_status
索引不是多余的。没有任何其他索引以post_status
作为前导列。
但post_type
索引是多余的。
post_type
列(在您的话中)"索引两次"。
它是两个索引中的主要列:post_type
和type_status_date
。
2)如果是,哪一个最好删除?分组或单个?
如果任何查询使用type_status_date
复合索引,则要删除的索引将是单列post_type
上的索引。