我目前正在使用某些视图的mysql项目,有一个主视图加入这些“子视图”
如果我在子视图中使用ORDER BY
,那么当我在主视图中加入此子视图时,它会影响性能吗?
或者最好不在子视图中订购任何东西,只在主要订单中订购?
我的SUB VIEW之一的示例:
CREATE VIEW `boletin_infoasuntos` AS
SELECT
`bd`.`idBoletin`,
`d`.`idAsunto`,
COUNT(`d`.`idAsunto`) AS `total`
FROM
`tblboletin_declaracion` AS `bd`
JOIN `tbldeclaracion` AS `d` USING(`idDeclaracion`)
GROUP BY
`bd`.`idBoletin`,
`d`.`idAsunto`
ORDER BY
`bd`.`idBoletin` DESC;
请注意ORDER BY
用法。
然后从主视图加入。
主要观点:
CREATE VIEW `boletin_actores` AS
SELECT
`bd`.`idBoletin`,
`d`.*,
FROM
`tblboletin_declaracion` AS `bd`
LEFT JOIN `declaraciones` AS `d`
ON `bd`.`idDeclaracion` = `d`.`idDeclaracion`
LEFT JOIN `boletin_infoasuntos` AS `bia`
ON `bd`.`idBoletin` = `bia`.`idBoletin`
ORDER BY
`bd`.`idBoletin` DESC,
`bia`.`total` DESC,
`d`.`asunto` ASC;
你会推荐什么?我是为了性能优化,但我执行的测试显示速度没有明显差异。
谢谢!
答案 0 :(得分:2)
在MySQL 5+的版本中,查询执行计划模块能够推迟排序操作,直到查询执行尽可能晚。因此,在大多数情况下,您所做的事情会表现得非常好。在可能的情况下,查询深处的ORDER BY
操作将被忽略,以支持最外层的操作。
尽管如此,许多SQL应用程序设计者仍将结果集排序视为数据表示的一部分。这意味着排序将在最外层的查询中完成,而不是在任何视图中完成。如果您遵循该设计原则,则会从视图定义中省略ORDER BY
个子句。
答案 1 :(得分:0)
第二个视图的ORDER BY包含多个表中的列这一事实意味着它必须先创建一个包含结果的临时表,然后才能对其进行排序。
但MySQL中的视图通常会创建一个临时表,所以很可能你不会看到性能上的巨大差异。
有关视图导致的临时表的更多详细信息,另请参阅http://dev.mysql.com/doc/refman/5.6/en/view-algorithms.html。