mysql - 如何在连接查询rails mysql中包含索引列以提高性能
问题描述
众所周知,如果日期列与任何 SQL 函数映射,则索引不适用于日期列。
人们说,包括案例之间的日期列或<= 和 >=可以提供索引日期列以显示基于该索引的数据(意味着性能得到了提高)。但是,我发现两者都给出相同的结果,并且显然没有考虑到性能。
如果一切都简化了,我们如何才能最大限度地减少查询时间。或者有什么更好的解决方案来应对它?
我在project_times.date和project_plans.month添加了索引
例子:
在列project_times.date和project_plans.month上没有 sql 函数的查询 1返回 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.date和project_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'))
附图还显示了查询计划和解释语句输出。
解决方案
以 2 个月而不是 12 个月的范围运行这些查询。查询 1可能开始使用索引。这是因为使用索引有开销;因此,如果它没有提供太多好处(不是很有选择性),优化器就会避开它。
LEFT
除非您需要,否则请不要使用。
这些查询似乎将输出限制在 2021 年有时间和计划的项目上?如果这不是本意,请解释。
查询 2 肯定不会使用索引,因为诸如 之类的函数EXTRACT
不是“可存储的”。
真的; BETWEEN
在所有方面都与>=
和相同<=
推荐阅读
- php - Laravel 6 路由变量控制器方法
- javascript - 有没有办法使用 Google Apps 脚本渲染图像?
- python - 如何通过 ssh 获取本地显示?
- java - 无法从 Side the War 文件中找到 application.properties 文件
- php - 如何使用 file_exists 访问 ftp 服务器外部的文件
- android - 如何在不单击的情况下将特定的 ListView 项目位置获取到 TextView
- json - TypeError:“dict”对象在 Python 中不可调用
- java - 结合 jsonpath 表达式读取 json 字符串中的 2 个嵌套属性
- ios - 我们如何在 Swift (StoryBoard) 中通过 UITableViewController 创建自定义视图?
- python - 我可以在 python 中使用 rust 的匹配项吗?