簡體   English   中英

如何在連接查詢軌道 mysql 中包含索引列以提高性能

[英]How to include indexed columns in join query rails mysql to improve performance

眾所周知,如果日期列與任何 SQL function 映射,則索引不適用於日期列。

人們說,包括案例之間的日期列或<= 和 >=可以提供索引日期列以顯示基於該索引的數據(意味着性能得到了提高)。 但是,我發現兩者都給出相同的結果,並且顯然沒有考慮到性能。

如果一切都簡化了,我們如何才能最大限度地減少查詢時間。 或者有什么更好的解決方案來應對它?

我在project_times.dateproject_plans.month添加了索引

例子:

查詢 1 沒有 sql 列project_times.dateproject_plans.month函數返回 87 條記錄,但時間很長。 可能是也可能不是對列進行了索引:

ProjectConsultant Load (1169.8ms)  SELECT DISTINCT `project_consultants`.* FROM
 `project_consultants` LEFT OUTER JOIN `projects` ON `projects`.`id` =
 `project_consultants`.`project_id` LEFT OUTER JOIN `project_times` ON
 `project_times`.`project_id` = `projects`.`id` LEFT OUTER JOIN `project_plans` ON
 `project_plans`.`project_id` = `projects`.`id` WHERE (projects.internal =0 and
 (project_times.date >= '2021-01-01' and project_times.date <= '2021-12-31' or
 project_plans.month >= '2021-01-01' and project_plans.month <= '2021-12-31'))

在列project_times.dateproject_plans.month上使用 sql 函數查詢 2,例如((extract(year from project_times.date))(extract(year from project_plans.month)) ,它返回 87 條記錄,但時間又很長(技術上沒有索引在列上完成):

ProjectConsultant Load (1342.6ms)  SELECT DISTINCT `project_consultants`.* FROM
 `project_consultants` LEFT OUTER JOIN `projects` ON `projects`.`id` =
 `project_consultants`.`project_id` LEFT OUTER JOIN `project_times` ON
 `project_times`.`project_id` = `projects`.`id` LEFT OUTER JOIN `project_plans` ON
 `project_plans`.`project_id` = `projects`.`id` WHERE (projects.internal =0 and (extract(year
 from project_times.date) ='2021' or extract(year from project_plans.month) ='2021'))

附圖還顯示了查詢計划和解釋語句 output。

項目計划表的表結構

項目時間表的表結構

項目顧問表的表結構

查詢 1 的查詢計划

查詢 2 的查詢計划

以 2 個月而不是 12 個月的范圍運行這些查詢。 查詢 1可能開始使用索引。 這是因為使用索引有開銷; 因此,如果它沒有提供太多好處(不是很有選擇性),優化器就會避開它。

除非您需要,否則請不要使用LEFT

這些查詢似乎將 output 限制在 2021 年有時間計划的項目? 如果這不是本意,請解釋。

查詢 2 肯定不會使用索引,因為諸如EXTRACT之類的函數不是“可存儲的”。

真的; BETWEEN在所有方面與>=<=相同

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM