gpt4 book ai didi

mysql - 我需要添加哪些索引来加速这个 MYSQL JOIN/GROUP BY/HAVING 查询?

转载 作者:行者123 更新时间:2023-11-29 00:55:05 25 4
gpt4 key购买 nike

当 current_vacature_response 包含 88k 条记录,daily_vacature_response 包含 10k 条记录时,执行以下查询大约需要 30 秒。使用 EXPLAIN 我得出结论,current_vacature_response 表中没有使用任何索引。我添加了一些基本索引,但似乎没有一个被使用。我需要设置什么样的索引来加速这个查询?

查询:

SELECT c.`stats_date` as `stats_date` 
FROM `current_vacature_response` c
LEFT JOIN `daily_vacature_response` d ON (c.`stats_date` = d.`stats_date` )
GROUP BY c.`stats_date`, d.`stats_date`
HAVING max(d.`last_stats_datetime`) IS NULL
OR MAX(d.`last_stats_datetime`) < MAX(c.`created_datetime`);

current_vacature_response 表定义:

CREATE TABLE `current_vacature_response` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`created_datetime` datetime NOT NULL,
`site_id` tinyint(1) unsigned NOT NULL,
`stats_date` date NOT NULL,
`type` enum('typ1', 'type2') NOT NULL,
`vacature` int(10) unsigned NOT NULL,
PRIMARY KEY (`id`),
KEY `current_vacature_created_datetime` (`created_datetime`),
KEY `current_vacature_response_vacature` (`vacature`),
KEY `current_vacature_response_type` (`type`),
KEY `current_vacature_stats_date` (`stats_date`)
) ENGINE=MyISAM AUTO_INCREMENT=88210 DEFAULT CHARSET=utf8;

daily_vacature_response 表定义:

CREATE TABLE `daily_vacature_response` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`contact` int(10) unsigned NOT NULL DEFAULT '0',
`site_id` tinyint(1) unsigned NOT NULL,
`spotlight_result` int(10) unsigned NOT NULL DEFAULT '0',
`stats_date` date NOT NULL,
`last_stats_datetime` datetime NOT NULL,
`vacature` int(10) unsigned NOT NULL,
`created_datetime` datetime NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `daily_vacature_response_key` (`site_id`,`vacature`,`stats_date`),
KEY `daily_vacature_response_last_stats_datetime` (`last_stats_datetime`),
KEY `daily_vacature_response_stats_date` (`stats_date`)
) ENGINE=MyISAM AUTO_INCREMENT=9802 DEFAULT CHARSET=utf8;

解释输出:

*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: c
type: ALL
possible_keys: NULL
key: NULL
key_len: NULL
ref: NULL
rows: 88209
Extra: Using temporary; Using filesort
*************************** 2. row ***************************
id: 1
select_type: SIMPLE
table: d
type: ref
possible_keys: daily_vacature_response_stats_date
key: daily_vacature_response_stats_date
key_len: 3
ref: reporting_development.c.stats_date
rows: 99
Extra:

最佳答案

尝试在 daily_vacature_response(stats_date, last_stats_datetime) 上建立索引。

我怀疑它会产生巨大的变化,但这是最有可能的候选者。

此外,尝试稍微重写查询(在 MySQL 中可能不起作用,但值得一试):

GROUP BY c.`stats_date`, c.`created_datetime`, d.`stats_date` 
HAVING max(d.`last_stats_datetime`) IS NULL
OR max(d.`last_stats_datetime`) < c.`created_datetime`;

关于mysql - 我需要添加哪些索引来加速这个 MYSQL JOIN/GROUP BY/HAVING 查询?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6464996/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com