我有以下查询:
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/