MySQL分组索引和单一索引有什么区别
What is the difference between MySQL grouped indexes and single indexes
在PHP管理中检查我的索引时,我发现了一些分组索引和一些单一索引。
1)我的索引是例如post_status 索引两次?
2) 如果是这样,最好删除哪一个?群发还是单发?
见截图:
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_type
和 type_status_date
。
2) 如果是这样,最好删除哪一个?群发还是单发?
如果任何查询使用 type_status_date
复合索引,则要删除的索引将是单个列 post_type
.
上的索引
在PHP管理中检查我的索引时,我发现了一些分组索引和一些单一索引。
1)我的索引是例如post_status 索引两次?
2) 如果是这样,最好删除哪一个?群发还是单发?
见截图:
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_type
和 type_status_date
。
2) 如果是这样,最好删除哪一个?群发还是单发?
如果任何查询使用 type_status_date
复合索引,则要删除的索引将是单个列 post_type
.