MySQL分组索引和单个索引之间有什么区别

时间:2016-03-18 03:47:56

标签: mysql indexing phpmyadmin database-performance database-optimization

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

查看截图: enter image description here

2 个答案:

答案 0 :(得分:1)

来自Multiple-column index

  

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_typetype_status_date

2)如果是,哪一个最好删除?分组或单个?

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