如何解决MariaDB 查询优化
是否有任何选项可以优化此查询。它已经运行了将近4个小时,我仍然没有结果。表的当前行数为 282359
select c.id
from capacity_log c
where c.id = (
select c1.id
from capacity_log c1
where
c1.date_occurred < '2020-10-1'
and c1.aux2 is null
and c1.order_product_id = c.order_product_id
and yearweek(c1.date_occurred) = yearweek(c.date_occurred)
order by c1.used_capacity desc limit 1
)
想法是为每个order_product_id取每周最大使用容量列的id
CREATE TABLE `capacity_log` (
`id` INT UNSIGNED NOT NULL AUTO_INCREMENT,`date_occurred` DATETIME NOT NULL,`ip_address` VARCHAR(255) NOT NULL DEFAULT '',`order_product_id` INT UNSIGNED NOT NULL,`serial` VARCHAR(255) NOT NULL DEFAULT '',`used_capacity` BIGINT NULL DEFAULT NULL,`aux2` INT NULL DEFAULT NULL,`request` BLOB NULL,`retry_count` INT NOT NULL DEFAULT '0',`fetch_time` INT NOT NULL DEFAULT '0',`response` BLOB NULL,`custom_fetch_time` INT NOT NULL DEFAULT '0',PRIMARY KEY (`id`),INDEX `user_id` (`order_product_id`))
+------+--------------------+-------+------+---------------+---------+---------+--------------------------------+--------+-----------------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+------+--------------------+-------+------+---------------+---------+---------+--------------------------------+--------+-----------------------------+
| 1 | PRIMARY | c | ALL | NULL | NULL | NULL | NULL | 390573 | Using where |
| 2 | DEPENDENT SUBQUERY | c1 | ref | user_id | user_id | 4 | web_license.c.order_product_id | 134 | Using where; Using filesort |
+------+--------------------+-------+------+---------------+---------+---------+--------------------------------+--------+-----------------------------+
版本:10.1.47-MariaDB-0+deb9u1
解决方法
使用窗口函数,需要升级到 MariaDB 10.2 或更高版本:
select t.id
from (
select id,row_number() over (partition by order_product_id,yearweek(date_occurred) order by used_capacity desc) as rownum
from capacity_log
where date_occurred < '2020-10-1'
and aux2 is null
) as t
where t.rownum = 1;
我认为以下索引将有助于此查询:
alter table capacity_log add index (aux2,date_occurred,order_product_id,used_capacity);
但我不使用 MariaDB,所以我没有对此进行测试。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。