如何解决如何使用 col IN () 和日期范围优化查询?
表结构如下。
CREATE TABLE `log` (
`id` BIGINT(20) NOT NULL,`name` VARCHAR(66) NULL DEFAULT NULL,`insert_date` DATETIME(6) NULL DEFAULT NULL,PRIMARY KEY (`id`),INDEX `name` (`name`),INDEX `insert_date` (`insert_date`)
);
原始查询如下。
SELECT *
FROM log AS irl
WHERE irl.name IN (
'abc','bcd','etc' ....
/* Less than 10,000 and can be imported from other tables using subqueries. */
)
AND irl.insert_date >= @START_DATE
AND irl.insert_date <= @END_DATE;
日志表中的行数至少为 1000 万,可以以十亿为单位。
原始查询太慢。
如果有好的方法请介绍一下。
解决方法
尝试两个不同的复合索引,一个接一个。
CREATE INDEX firstOneToTry ON log (name,insert_date);
然后
CREATE INDEX secondOneToTry ON log (insert_date,name);
如果您的查询说
WHERE irl.name = 'abc'
AND irl.insert_date >= @START_DATE
AND irl.insert_date <= @END_DATE
我建议的第一个索引显然是正确的选择。但是,由于您选择了多个 name
值,情况就不那么清楚了。
而且,您的日期过滤器有误。考虑使用它,<
表示日期范围的结束。否则,您将不会在@END_DATE 午夜之后获得任何行。
AND irl.insert_date >= DATE(@START_DATE)
AND irl.insert_date < DATE(@END_DATE) + INTERVAL 1 DAY
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。