如何解决MySQL View数据类型问题?
我认为VIEW
中的列只是继承了基础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 举报,一经查实,本站将立刻删除。