PooH, я видел твой вариант. Но в такой форме нельзя сделать зависимости в подчиненных таблицах и выбрать данные по одному пользователю или по списку. Если же выбирать по всем пользователям, то твой вариант оптимальнее.
Кстати, id_who не является первичным ключем. Чтение таблиц неизбежно, т.к. нужны поля ballet и voting. Т.е. если сперва сгруппировать, то будет полное чтение таблицы. Если же группировать по равенству ключа, то чтение выборочное.
Попробую залить таблицы заново и проверить план.
Добавлено через 16 минут и 28 секунд:Первый запрос отсюда:
https://forum.shelek.ru/index.php/topic,27290.msg262661.html#msg262661+----+-------------+------------+-------+---------------+---------+---------+------+------+----------+----------------------------------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
+----+-------------+------------+-------+---------------+---------+---------+------+------+----------+----------------------------------------------+
| 1 | PRIMARY | <derived2> | ALL | NULL | NULL | NULL | NULL | 4 | 100.00 | |
| 2 | DERIVED | users | index | NULL | PRIMARY | 4 | NULL | 4 | 100.00 | Using index; Using temporary; Using filesort |
| 2 | DERIVED | videos | ALL | NULL | NULL | NULL | NULL | 23 | 100.00 | |
| 2 | DERIVED | photos | ALL | NULL | NULL | NULL | NULL | 10 | 100.00 | |
| 2 | DERIVED | articles | ALL | NULL | NULL | NULL | NULL | 9 | 100.00 | |
+----+-------------+------------+-------+---------------+---------+---------+------+------+----------+----------------------------------------------+
Запрос отсюда:
https://forum.shelek.ru/index.php/topic,27290.msg262656.html#msg262656+----+-------------+------------+------+---------------+------+---------+------+------+----------+---------------------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
+----+-------------+------------+------+---------------+------+---------+------+------+----------+---------------------------------+
| 1 | PRIMARY | u | ALL | NULL | NULL | NULL | NULL | 4 | 100.00 | |
| 1 | PRIMARY | <derived2> | ALL | NULL | NULL | NULL | NULL | 2 | 100.00 | |
| 1 | PRIMARY | <derived3> | ALL | NULL | NULL | NULL | NULL | 2 | 100.00 | |
| 1 | PRIMARY | <derived4> | ALL | NULL | NULL | NULL | NULL | 2 | 100.00 | |
| 4 | DERIVED | t | ALL | NULL | NULL | NULL | NULL | 9 | 100.00 | Using temporary; Using filesort |
| 3 | DERIVED | t | ALL | NULL | NULL | NULL | NULL | 10 | 100.00 | Using temporary; Using filesort |
| 2 | DERIVED | t | ALL | NULL | NULL | NULL | NULL | 23 | 100.00 | Using temporary; Using filesort |
+----+-------------+------------+------+---------------+------+---------+------+------+----------+---------------------------------+
Добавляю в запросы выборку только "users.id = 1".
+----+-------------+------------+--------+---------------+---------+---------+------+------+----------+-------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
+----+-------------+------------+--------+---------------+---------+---------+------+------+----------+-------------+
| 1 | PRIMARY | <derived2> | system | NULL | NULL | NULL | NULL | 1 | 100.00 | |
| 2 | DERIVED | users | const | PRIMARY | PRIMARY | 4 | | 1 | 100.00 | Using index |
| 2 | DERIVED | videos | ALL | NULL | NULL | NULL | NULL | 23 | 100.00 | |
| 2 | DERIVED | photos | ALL | NULL | NULL | NULL | NULL | 10 | 100.00 | |
| 2 | DERIVED | articles | ALL | NULL | NULL | NULL | NULL | 9 | 100.00 | |
+----+-------------+------------+--------+---------------+---------+---------+------+------+----------+-------------+
+----+-------------+------------+-------+---------------+---------+---------+-------+------+----------+---------------------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
+----+-------------+------------+-------+---------------+---------+---------+-------+------+----------+---------------------------------+
| 1 | PRIMARY | u | const | PRIMARY | PRIMARY | 4 | const | 1 | 100.00 | |
| 1 | PRIMARY | <derived2> | ALL | NULL | NULL | NULL | NULL | 2 | 100.00 | |
| 1 | PRIMARY | <derived3> | ALL | NULL | NULL | NULL | NULL | 2 | 100.00 | |
| 1 | PRIMARY | <derived4> | ALL | NULL | NULL | NULL | NULL | 2 | 100.00 | |
| 4 | DERIVED | t | ALL | NULL | NULL | NULL | NULL | 9 | 100.00 | Using temporary; Using filesort |
| 3 | DERIVED | t | ALL | NULL | NULL | NULL | NULL | 10 | 100.00 | Using temporary; Using filesort |
| 2 | DERIVED | t | ALL | NULL | NULL | NULL | NULL | 23 | 100.00 | Using temporary; Using filesort |
+----+-------------+------------+-------+---------------+---------+---------+-------+------+----------+---------------------------------+
Добавляю в подчиненные таблицы неуникальный ключ KEY (id_who).
+----+-------------+------------+--------+---------------+---------+---------+------+------+----------+-------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
+----+-------------+------------+--------+---------------+---------+---------+------+------+----------+-------------+
| 1 | PRIMARY | <derived2> | system | NULL | NULL | NULL | NULL | 1 | 100.00 | |
| 2 | DERIVED | users | const | PRIMARY | PRIMARY | 4 | | 1 | 100.00 | Using index |
| 2 | DERIVED | videos | ref | id_who | id_who | 5 | | 20 | 100.00 | |
| 2 | DERIVED | photos | ref | id_who | id_who | 5 | | 5 | 100.00 | |
| 2 | DERIVED | articles | ref | id_who | id_who | 5 | | 5 | 100.00 | |
+----+-------------+------------+--------+---------------+---------+---------+------+------+----------+-------------+
+----+-------------+------------+-------+---------------+---------+---------+-------+------+----------+---------------------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
+----+-------------+------------+-------+---------------+---------+---------+-------+------+----------+---------------------------------+
| 1 | PRIMARY | u | const | PRIMARY | PRIMARY | 4 | const | 1 | 100.00 | |
| 1 | PRIMARY | <derived2> | ALL | NULL | NULL | NULL | NULL | 2 | 100.00 | |
| 1 | PRIMARY | <derived3> | ALL | NULL | NULL | NULL | NULL | 2 | 100.00 | |
| 1 | PRIMARY | <derived4> | ALL | NULL | NULL | NULL | NULL | 2 | 100.00 | |
| 4 | DERIVED | t | ALL | NULL | NULL | NULL | NULL | 9 | 100.00 | Using temporary; Using filesort |
| 3 | DERIVED | t | ALL | NULL | NULL | NULL | NULL | 10 | 100.00 | Using temporary; Using filesort |
| 2 | DERIVED | t | ALL | NULL | NULL | NULL | NULL | 23 | 100.00 | Using temporary; Using filesort |
+----+-------------+------------+-------+---------------+---------+---------+-------+------+----------+---------------------------------+
Вот где-то так я говорил: твой запрос оптимальнее при полной выборке (причем, индексы в подчиненных таблицах ему не нужны), а мой - на адресных выборках.
Добавлено через 4 минуты и 22 секунды:PooH, с точки зрения оракла все будет зависить от статистики по объектам и наличие необходимых объектов. Думаю в мускуле так же.
Макс, в MySQL статистика мало что определяет, хотя и используется оптимизатором. Чаще наоборот приходится бороться с оптимизатором хитрыми способами (например,
выборка GeoIP).