gpt4 book ai didi

MySQL Join based on YEAR() indexing - Column add or Generated Column

转载 作者:行者123 更新时间:2023-11-29 01:19:42 25 4
gpt4 key购买 nike

基于答案https://stackoverflow.com/a/1601812/4050261

我正在使用如下的 SQL 查询

FROM workdone
LEFT JOIN staffcost ON YEAR(workdone.date) = staffcost.costyear

上面的查询没有使用我在 workdone.date 列上的索引,因此非常慢。我想我有 2 个选择

选项1

添加另一列workdone.year,它通过表oncreateonupdate 事件更新。在查询中使用此列。

选项 2

添加Generated (Virtual/Persistent) workdone.year 列,然后在查询中使用此列。

我的问题:

  1. 哪个选项更好?从性能和数据重复的角度来看?
  2. 我应该使用 Virtual OR Persistent 列类型吗?
  3. 有没有更好的选择?

更新 1.1

我实现了 OJones 建议的解决方案,但解释显示没有使用索引。我是否错误地阅读了下面的屏幕截图? adminer Explain

最佳答案

你可以试试这个:

FROM workdone
LEFT JOIN staffcost ON workdone.date >= MAKEDATE(staffcost.costyear, 1)
AND workdone.date < MAKEDATE(staffcost.costyear+1, 1)

这将允许使用 workdone.date 上的索引来搜索 costyear 的第一天到但不包括 的第一天之间的日期code>costyear+1.

一般来说,这种范围搜索可以利用函数(例如 YEAR(datestamp))不能利用的索引。

关于MySQL Join based on YEAR() indexing - Column add or Generated Column,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48590120/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com