Mysql
TIMESTAMP 列上的 WHERE 子句會導致嚴重的性能損失
我有一個
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
。