MySQL使用日期范围优化查询

MySQL使用日期范围优化查询,mysql,select,optimization,Mysql,Select,Optimization,我有下面的表结构 id (INT) index date (TIMESTAMP) index companyId (INT) index 这就是我面临的问题 公司ID 111:在一年内总共有100000行 公司ID 222:在一年内总共有8000行 如果companyId 111在'2020-09-01 00:00:00'和'2020-09-06 23:59:59'之间有100行,并且companyId 222在相同的日期范围内有2000行,companyId 111比222慢得多,即使它在所

我有下面的表结构

id (INT) index
date (TIMESTAMP) index
companyId (INT) index
这就是我面临的问题

公司ID 111:在一年内总共有100000行

公司ID 222:在一年内总共有8000行

如果companyId 111
'2020-09-01 00:00:00'和'2020-09-06 23:59:59'
之间有100行,并且companyId 222在相同的日期范围内有2000行,companyId 111222慢得多,即使它在所选日期范围内的行数较少

MySQL不应该忽略日期范围之外的所有行,以便查询速度更快吗

这是我正在使用的查询示例:

SELECT columns FROM table WHERE date BETWEEN '2020-09-01 00:00:00' AND '2020-09-06 23:59:59' AND companyId = 111;
谢谢

我建议在这里建立一个综合指数:

CREATE INDEX idx ON yourTable (companyId, date);
前提的问题是,虽然在每列上都有一个索引,但没有任何索引完全覆盖示例查询的
WHERE
子句。因此,MySQL甚至可能选择不使用任何索引。您还可以尝试颠倒上述索引的顺序来比较性能:

CREATE INDEX idx ON yourTable (date, companyId);

我应该创建这个新索引并保持其他索引不变,还是应该编辑/删除它们?@CrashOverride-请提供
SHOW create TABLE
;我们无法猜测您还有哪些其他索引。一般来说,丢弃另一个索引的左边部分的任何索引。首先放置
companyID
,因为它是用“=”测试的。那么索引中所有必要的“行”都是连续的。@RickJames我也会在假设
companyId
具有更高的基数的情况下建议第一个版本。基数是不相关的。索引的结构是。请发布显示创建表的文本结果;因此,我们可以看到您是否及时将任何建议应用到这一点。有人会帮你获得高性能。你是否有时间发布SHOW CREATE TABLE的当前文本结果;所以我们可以看到,对于一个有索引的表,您最终得到了什么?可以回答-不,我们会理解的。