首页 > 解决方案 > 用于连接的mysql索引列顺序

问题描述

我有两个表(请求,结果)

要求:电子邮件

结果:电子邮件,已处理_at

我现在想获取所有具有相同电子邮件请求且尚未处理的结果:

SELECT * FROM results
INNER JOIN requests ON requests.email = results.email
AND results.processed_at IS NULL

我在每个单独的列上都有一个索引,但是查询很慢。所以我假设我需要一个关于结果的多列索引:

我只是不确定列必须是什么顺序:

ALTER TABLE results 
ADD INDEX results_email_processed_at (email,processed_at) 
ALGORITHM=INPLACE LOCK=NONE;

或者

ALTER TABLE results 
ADD INDEX results_processed_at_email (processed_at,email) 
ALGORITHM=INPLACE LOCK=NONE;

标签: mysqljoinindexing

解决方案


任何一个综合指数都将同样有益。

但是,如果您要获取表的 40%,那么优化器可能会选择忽略任何索引并简单地扫描表。

SELECT是实际的查询吗?如果没有,请向我们展示实际查询;一些看似很小的更改可能会对优化选项产生很大影响。

请提供EXPLAIN SELECT ...,以便我们可以看到它对当前索引的看法。SHOW CREATE TABLE如果存在相关的数据类型问题,请提供。


推荐阅读