mysql - 如何优化此查询并减少其执行时间

标签 mysql sql performance

我有一个查询:

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/

相关文章:

php - mysql_escape_string 整个帖子数组?

SQL Server DateTime2(0) 与日期

c# - ASPX 如何通过 Windows 授权连接到另一个 IP 中的 SQL 2008?

java - 有效地找出落在边界框下的图像 block

php - 保存并从 sql 获取哈希值

mysql - 如何设计和测试 Rails 中的大量并发数据?

java - 如何通过 MySQL 触发器执行外部 java 函数?

PHP SQL 选择日期之间的行

java - 从基于字符串的键路径快速访问值

c# - 维护排序顺序的集合 C#