Mysql 我应该一直使用createview而不是JOIN吗

Mysql 我应该一直使用createview而不是JOIN吗,mysql,database,query-optimization,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约有15M+行,a约有3M+行 当我对上述查询进行EXPLAIN时,我收到一条通知,说它总

我有以下疑问:

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
约有15M+行,
a
约有3M+行

当我对上述查询进行
EXPLAIN
时,我收到一条通知,说它总是创建一个临时表。我注意到基于上述查询创建临时表花费了相当长的时间。而且,这需要很多时间

因此,我想知道是否使用上述方法创建视图:

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是否有这样的东西,我自己也是DB2人:-)

但是,如果查询的性能有问题,您可以自己实现这样的方案


这在很大程度上取决于表格的变化率。如果数据变化如此频繁以至于每次都必须重新生成具体化的查询,那就不值得了。

每次查询视图时,视图都会在内部连接两个表

要防止出现这种情况,请创建物化视图

It is a view that is more of a TABLE ...You can query it directly as other table..
但是,如果任何基础表数据发生更改,您必须编写一些触发器来自动更新它


看到这一点:

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

MySQL有两种处理视图的方法——查询合并,在这种情况下,视图被简单地扩展为宏或临时表,在这种情况下,视图被物化为临时表(没有索引!),稍后在查询执行中进一步使用。 似乎没有对用于从外部查询创建临时表的查询应用任何优化,另外,如果使用多个临时表视图并将其连接在一起,则可能会出现严重问题,因为这些表没有任何索引

所以在应用程序中实现MySQL视图时要非常小心,尤其是那些需要临时表执行方法的视图。使用视图时,性能开销非常小,但只有在谨慎使用的情况下才能使用

MySQL在正确优化视图的查询方面还有很长的路要走