【问题标题】:MySQL View data type issue?MySQL View 数据类型问题?
【发布时间】:2020-09-26 15:39:08
【问题描述】:

我认为VIEW 中的列只是继承了底层TABLE 中使用的数据类型,但事实并非如此。

我有一个 MySQL TABLE 喜欢:

"myTable"

FIELD TYPE NULL KEY DEFAULT EXTRA
id int(11) NO PRI NULL auto_increment
dt datetime NO MUL NULL
foo smallint(5) unsigned NO NULL

我可以像这样查询表:
SELECT dt, SUM(foo) FROM myTable WHERE dt>DATE_SUB(Now(), INTERVAL 3 DAY) GROUP BY dt


现在我需要能够查询相同的数据,但对某些列使用备用名称(例如“foo”)。 [我将跳过对为什么的冗长解释!]

我认为一个简单的解决方案是VIEW:
CREATE VIEW myView AS ( SELECT id, dt, grps AS groups FROM myTable ORDER BY dt )

这会创建一个包含如下列的视图:

"myView"

FIELD TYPE NULL KEY DEFAULT EXTRA
id int(11) NO 0
dt datetime NO NULL
foobar smallint(5) unsigned NO NULL


问题出现在我查询视图时:(几乎与上一个查询相同)

SELECT dt, SUM(foobar) AS foo FROM myView WHERE dt>DATE_SUB(Now(), INTERVAL 3 DAY) GROUP BY dt

查询运行时未产生错误,但响应为零记录

我发现如果我像这样CASTWHERE 子句,那么它可以正常工作(尽管它非常缓慢。)

。 . . WHERE CAST(dt>DATE_SUB(Now(), INTERVAL 3 DAY)

CASTing 所有列会很乏味,而且它会大大减慢查询的执行速度。 (有 500 万条记录并且还在增长。)

为什么 sql 强制我重新转换字段?我该怎么办?

谢谢!

【问题讨论】:

  • 首先从视图的创建文本中删除ORDER BY dt。很可能它会在下一步中放慢速度。
  • 从视图定义中删除 ORDER BY 确实有帮助。我仍然认为空结果集是一个错误,并将为此创建一个错误报告......
  • @BarbarosÖzhan - 修复了它!谢谢 - 但是……嗯?!为什么排序基础记录(按日期)会导致分组时(按日期)不返回任何记录?
  • @BarbarosÖzhan - 如果您想将其更改为答案(如果可能,请提供解释?!)然后我会接受答案

标签: mysql database data-structures view mariadb


【解决方案1】:

原来这是 MariaDB 10.2 引入的回归。不知何故,在视图定义中包含 ORDER BY 与使用该视图的查询的同一列上的 GROUP BY 效果不佳。

我为此创建了以下错误报告:

https://jira.mariadb.org/browse/MDEV-23826

【讨论】:

    【解决方案2】:

    您应该删除视图创建语句中的ORDER BY 子句。

    因为,对于视图的每次调用,都会对整个记录集进行扫描和排序,然后才能得到您可能不想对其进行排序的结果。这使得ORDER BY 子句变得多余,并可能对性能造成不利影响。

    【讨论】:

      猜你喜欢
      • 2012-03-03
      • 2021-01-22
      • 2021-10-18
      • 2021-04-24
      • 2011-10-26
      • 2011-11-03
      • 1970-01-01
      • 2010-12-24
      相关资源
      最近更新 更多