聚合查询的MySQL View性能问题

我正在使用mysql版本5.6.47。 我有下表用于学生评分:

CREATE TABLE `studentmarks` (
  `ID` int(11) NOT NULL AUTO_INCREMENT,`StudentID` int(11) NOT NULL,`subjectName` varchar(255) DEFAULT NULL,`MARKS` int(11) NOT NULL,PRIMARY KEY (`ID`),KEY `idx_studentmarks_StudentID` (`StudentID`)
);

并在桌子上创建一个视图:

CREATE OR REPLACE VIEW `vw_student_marks` AS
    SELECT 
        `s1`.`StudentID` AS `StudentID`,`s1`.`subjectName` AS `subjectName`,`s1`.`MARKS` AS `marks`,(SELECT 
                SUM(`s2`.`MARKS`)
            FROM
                `studentmarks` `s2`
            WHERE
                (`s2`.`StudentID` = `s1`.`StudentID`)) AS `totalMarks`
    FROM
        `studentmarks` `s1`;

在测试约2万行时,运行SELECT querySELECT * FROM VIEW的性能存在明显差异。 select查询显示仅执行一次全表扫描的优化执行计划,而要查看则执行两次全表扫描。

查询状态(由MySQL Workbench测量):

选择查询

Timing: 0:00:0.07677120 (as measured by the server)

Rows Examined: 108285

从查看查询中选择:

Timing: 0:00:1.6082441 (as measured by the server)

Rows Examined: 2985730

这种性能差异背后的原因是什么?

查询执行计划:https://i.stack.imgur.com/noOxI.jpg

更新:我使用MySQL 8.0.19版进行了测试,发生了同样的问题

fxbxx 回答:聚合查询的MySQL View性能问题

在这种情况下,MySQL必须对视图使用TEMPTABLE算法(聚合函数)。这可能是造成差异的原因。

您可以参考https://dev.mysql.com/doc/refman/5.6/en/view-algorithms.html以获得更多详细信息。

如果无法使用MERGE算法,则必须使用临时表 代替。如果视图包含以下任何内容,则无法使用MERGE: 以下结构:

集合函数(SUM(),MIN(),MAX(),COUNT()等)

DISTINCT

组别

拥有

LIMIT

UNION或UNION ALL

选择列表中的子查询

分配给用户变量

仅引用文字值(在这种情况下,没有底层 表格)

,

FWIW,我将使用不相关的子查询来编写此代码(但我接受它不一定会提高性能)-并放弃了完全使用视图的想法...

    <input type="button" value="add" onclick="add()">
   <!-- add an element to hold your result -->
   <h1 id="myHeader">Hello World!</h1>
本文链接:https://www.f2er.com/2686700.html

大家都在问