微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

MySQL View数据类型问题?

如何解决MySQL View数据类型问题?

我认为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

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

我发现,如果我像这样CAST WHERE子句,它就可以正常工作(尽管速度很慢)。

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

CAST处理所有列将是乏味的,而且会大大降低查询的执行速度。 (有500万条记录,并且还在增长。)

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

谢谢!

解决方法

结果证明这是MariaDB 10.2引入的一种回归。在使用该视图的查询的同一列上,以某种方式在视图定义中使用ORDER BY效果并不理想,而在同一列上使用了GROUP BY

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

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

,

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

因为,对于视图的每次调用,在带来您可能不想对其进行排序的结果之前,整个记录集都会进行扫描和排序。这使ORDER BY子句变得多余,并且可能会对性能产生不利影响。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。