需要注意的是,我使用的是 Magento 2,所以如果查询看起来有点奇怪,这就是原因。
我有以下查询并正在尝试优化表的索引;
SELECT `main_table`.`id`,
`main_table`.`id`,
`main_table`.`created_at`
FROM `yotpo_order_status_history` AS `main_table`
WHERE (`order_id` = 12709301)
AND (`store_id` = 1)
ORDER BY created_at DESC, id DESC LIMIT 1;
我不确定我的 alter 查询是否应该仅包含一次 created_at 和 id;
alter table yotpo_order_status_history add index (order_id, store_id, created_at, id);
或者我是否应该像这样将它们包含两次;
alter table yotpo_order_status_history add index (order_id, store_id, created_at, id, created_at, id);
我一直在寻找这个问题的答案,但没有找到任何提到这个特定场景的东西。我应该使用第一个选项而不定义两次列还是我需要使用第二个选项?我熟悉冗余索引及其对性能的影响,但这并不是我在这里遇到的。
只有一次。
=
:order_id, store_id
,以任何顺序ORDER BY
created_at, id
, 在给定的顺序(如果您添加非
=
测试 orGROUP BY
或 mixASC
andDESC
等,上述规则是不合适的!)main_table
(我无法解释.的重复id
)这告诉您如何构建该索引: Index Cookbook
(我不记得曾经听说过索引中的重复列。根据索引的工作原理,它永远没有必要。)
第一个是两者的赢家。但这不是最好的。最好的应该是
默认情况下,该值是按升序排列的,因此对于第一个,数据库引擎在不扫描所有值的情况下无法确定正确的rowid
id
。