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

MySQL分组索引和单个索引之间有什么区别,mysql,indexing,phpmyadmin,database-performance,database-optimization,Mysql,Indexing,Phpmyadmin,Database Performance,Database Optimization,在PHP管理员中检查索引时,我发现了一些分组索引和一些单个索引。 1) 我的索引(例如post_状态)是否索引了两次? 2) 如果是,最好删除哪一个?分组的还是单个的 请参见屏幕截图: 来自 MySQL可以对测试索引中所有列的查询使用多个列索引,或者只测试第一列、前两列、前三列等的查询。如果在索引定义中按正确的顺序指定列,则单个复合索引可以加速同一表上的多种查询 因此,如果筛选条件包括所有列、最左边的一列、最左边的两列等,则将使用type\u status\u date索引,例如 SELECT

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

请参见屏幕截图: 来自

MySQL可以对测试索引中所有列的查询使用多个列索引,或者只测试第一列、前两列、前三列等的查询。如果在索引定义中按正确的顺序指定列,则单个复合索引可以加速同一表上的多种查询

因此,如果筛选条件包括所有列、最左边的一列、最左边的两列等,则将使用
type\u status\u 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\u type
列的
post\u type
索引是冗余索引,因此可以将其删除<由于
id
列是主键,因此
type\u status\u date
索引中的code>id列也是冗余的。您可以删除
type\u status\u date
索引中的“id”列

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

但以下查询将无法使用
type\u status\u date
索引,因为
post\u status
不是
type\u status\u date
索引中最左边的列。对于此查询,将使用
post_status
索引

SELECT * FROM your_table WHERE 
   post_status=a_constant_value1;
1)我的后状态索引是否索引了两次

post_status
索引不是冗余的。没有任何其他索引将
post\u status
作为前导列

但是
post\u类型
索引是冗余的

post_type
列(用你的话来说)是“索引两次”

它是两个索引中的前导列:
post\u type
type\u status\u date

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


如果任何查询都使用了
type\u status\u date
复合索引,那么要删除的索引将是单个列
post\u type

上的索引!也许最好将它们全部作为单个索引?这取决于实际查询的方式。如果不确定,请使用
EXPLAIN
确定为特定查询选择了什么索引。这篇文章讨论了多列索引与多个索引在决定单列索引与多列索引时的性能。@mesqueeb:不,这不一定更好。任何可以有效利用
(类型)
上索引的查询都可以有效利用
(类型、状态、日期)
上的索引。有了第二个索引,我们可以将第一个索引放在singleton
(type)
列上,因为它是冗余的。对于具有以下谓词的查询:
type='a'和status='b'以及date>='2016-03-01'和date,
post\u type
索引是冗余的,可以删除。
post\u status
索引不是多余的,因为没有任何其他索引将
post\u status
作为前导列。)