Таблица: актер
-------------------------
| id | actor_id | notes |
-------------------------
| 1 | 1 | 'a' |
| 2 | 1 | 'a' |
| 3 | 2 | 'a' |
| 4 | 3 | 'a' |
| 5 | 3 | 'a' |
| 6 | 1 | 'a' |
-------------------------
SQL
SET @rownum := 0;
SELECT id, actor_id, @rownum FROM actor
WHERE @rownum <= 1
ORDER BY notes, LEAST(0, @rownum := @rownum + 1);
Это пример из раздела Детерминированный порядок оценки Глава 6 Оптимизация производительности запросов в High Performance MySQL, 3rd Edition.
Согласно тексту из книги и «Использование где; Использование временного; Используя результат filesort поля Extra объяснения SQL и этого я ожидал, что приведенный выше SQL выведет каждую строку таблицы актеров.
Я думал, что все шесть строк будут помещены во временную таблицу с использованием '@rownum ‹= 1', где сначала фильтруется, затем файловая сортировка применяется к этой временной таблице, и, наконец, распечатываются шесть строк.
Но реальных результатов всего 2:
+----+----------+---------+
| id | actor_id | @rownum |
+----+----------+---------+
| 1 | 1 | 1 |
| 2 | 1 | 2 |
+----+----------+---------+
Может ли кто-нибудь объяснить детали плана выполнения в этой ситуации?