Я использую 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`;
При тестировании с примерно 20К строками наблюдается заметная разница в производительности работает SELECT query
против SELECT * FROM VIEW
. Запрос на выборку показывает оптимизированный план выполнения с одним полным сканированием таблицы, в то время как для просмотра есть два полных сканирования таблицы.
Статистика запросов (измеряется MySQL Workbench):
SELECT QUERY
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, такая же проблема возникает