mysql - 我应该一直使用 CREATE VIEW 而不是 JOIN

标签 mysql database query-optimization

我有以下查询:

SELECT t.*, a.hits AS ahits 
                FROM t, a 
                WHERE (t.TRACK LIKE 'xxx')
                AND a.A_ID = t.A_ID
                ORDER BY t.hits DESC, a.hits DESC

运行非常频繁。表 t 有大约 1500 万行,a 有大约 300 万行。

当我对上述查询执行 EXPLAIN 时,我收到一条说明它总是创建一个临时表。我注意到根据上述查询创建一个临时表花了很长时间。而且,这已经完成了很多时间。

因此,我想知道我是否使用上面的语句创建了一个 View :

CREATE VIEW v_t_a 
SELECT t.*, a.hits AS ahits
FROM t, a
WHERE a.A_ID = t.A_ID

并将我的代码更改为:

SELECT * FROM v_t_a WHERE TRACK LIKE 'xxx' ORDER BY hits DESC, ahits DESC

它会提高性能吗?它会删除创建临时表的时间吗?

非常感谢您的建议!

最佳答案

如果您假设 MySQL 会像更高级的数据库系统一样优化您的 View ,那将是非常危险的。与子查询和派生表相同,MySQL 5.0 将失败并且在许多方面执行效率非常低。

MySQL 有两种处理 VIEWS 的方法——查询合并,在这种情况下,VIEW 被简单地扩展为宏或临时表,在这种情况下,VIEW 被具体化为临时表(没有索引!),稍后在查询执行中进一步使用. 似乎没有对用于从外部查询创建临时表的查询应用任何优化,而且如果您使用多个临时 TableView 并将它们连接在一起,您可能会遇到严重问题,因为此类表没有获得任何索引。

因此在您的应用程序中实现 MySQL VIEW 时要非常小心,尤其是那些需要临时表执行方法的。使用 VIEW 的性能开销非常小,但前提是要谨慎使用。

MySQL 要获得具有适当优化的 VIEW 的查询还有很长的路要走。

关于mysql - 我应该一直使用 CREATE VIEW 而不是 JOIN,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9578673/

相关文章:

mysql - 检查 ALTER TABLE 之前是否存在列 -- mysql

php - 使用 Mercurial 进行开发和生产 php/MySQL 查询管理

database - 如何使用单引号从 Apache Usergrid 中选择实体

php - 基于变量的表

PostgreSQL。优化从大表中检索不同的值

mysql - 如何将 MySQL 数据库公开为 OData

php - 数据库并发问题

database - 是否有用于音乐信息(专辑、艺术家、轨道)的免费数据库或网络服务 api?

mysql - var1 的正确索引 IN (1, 2, ...) GROUP BY (var2) ORDER BY SUM(var3) LIMIT X

oracle - 为什么 Oracle 的查询规划器要添加一个复制约束的过滤谓词?