Mysql

TIMESTAMP 列上的 WHERE 子句會導致嚴重的性能損失

  • December 27, 2018

我有一個pages和一個page_views分別有 100k~ 和 4M~ 記錄的表。

我執行查詢以獲取具有最多 page_views 的熱門頁面:

   select `pages`.`id`, `pages`.`host`, `pages`.`embed_code_id`, `views`.`count` 
from `pages` 
inner join `embed_codes` on `pages`.`embed_code_id` = `embed_codes`.`id` 
inner join (
   select `page_id`, COUNT(*) AS count 
   from `page_views` 
   where `page_views`.`created_at` between '2018-12-25 13:20:35' and '2018-12-26 13:20:35' 
   group by `page_id`
   ) as views on `views`.`page_id` = `pages`.`id` 
where `embed_codes`.`id` in (512) 
and `embed_codes`.`account_id` = 173
order by `views`.`count` desc 
limit 6

此查詢需要超過 9 秒才能執行,但是當我WHERE刪除page_views. created_at,它只需要 700 毫秒~,我想這是可以接受的,考慮到表格的大小。

注意 -page_views.created_at已編入索引。

任何想法為什麼 WHERE 子句會導致這種緩慢?有什麼辦法可以避免嗎?謝謝。

看起來系統在 WHERE 條件下通過“created_at”上的索引進行搜尋,當您消除此條件時,它會通過“page_id”進行搜尋。如果您在“page_id”和“created_at”或以其他順序添加新的組合索引,優化器可能會找到正確的執行計劃。

需要的索引:

page_views:  (created_at, page_id)  -- in this order
pages:       (id)   -- probably already the PRIMARY KEY?
embed_codes: (id)   -- probably already the PRIMARY KEY?

如果添加這些索引後仍然存在問題,請提供EXPLAIN SELECT ...SHOW CREATE TABLE

索引食譜

引用自:https://dba.stackexchange.com/questions/225798