我有一个查询:
select *
from `ads_fact`
inner join `dim_make` on `dim_make`.`make_id` = `ads_fact`.`make_id`
inner join `dim_model` on `dim_model`.`model_id` = `ads_fact`.`model_id`
inner join `dim_state` on `dim_state`.`state_id` = `ads_fact`.`state_id`
inner join `dim_source` on `dim_source`.`source_id` = `ads_fact`.`source_id`
inner join `dim_fuel_type` on `dim_fuel_type`.`fuel_type_id` = `ads_fact`.`fuel_type_id`
inner join `dim_body_type` on `dim_body_type`.`body_type_id` = `ads_fact`.`body_type_id`
where 1=1
&& date_time >= DATE_SUB(CURDATE(), INTERVAL 14 DAY)
&& ad_status=0
order by ad_id DESC
limit 20
offset 0
我尝试了一些方法,但它的响应时间仍然超过 7 秒,谁能帮我优化这个查询。
最佳答案
优化器可能不能很好地处理这个问题。假设所有过滤器都来自 ads_fact
表...尝试先创建一个过滤器表:
CREATE TEMPORARY TABLE IF NOT EXISTS temp1 AS (
SELECT *
FROM `ads_fact`
WHERE 1=1
AND year > 2009
AND date_time >= DATE_SUB(CURDATE(), INTERVAL 14 DAY)
AND ad_status=0
ORDER BY ad_id DESC
LIMIT 20
OFFSET 0
)
然后将其连接回其他表:
SELECT *
FROM temp1
INNER JOIN `dim_make` ON `dim_make`.`make_id` = temp1.`make_id`
INNER JOIN `dim_model` ON `dim_model`.`model_id` = temp1.`model_id`
INNER JOIN `dim_state` ON `dim_state`.`state_id` = temp1.`state_id`
INNER JOIN `dim_source` ON `dim_source`.`source_id` = temp1.`source_id`
INNER JOIN `dim_fuel_type` ON `dim_fuel_type`.`fuel_type_id` = temp1.`fuel_type_id`
INNER JOIN `dim_body_type` ON `dim_body_type`.`body_type_id` = temp1.`body_type_id`
基本上,这将保证优化器对尽可能小的记录集进行所有过滤。然后将过滤后的集合连接回其他表。您当前的查询很可能正在完成所有连接,然后进行过滤、排序和限制(或者以低效的顺序执行操作,因为它无法提出一个好的计划)。
关于mysql - 如何优化此查询并减少其执行时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44187916/