sickboy
Новичок
Оптимизация запроса к 3-м таблицам без использования WHERE
Таблицы:
mysql> desc moviez; (описание фильмов) 214 строк.
mysql> desc moviez_dl_count; (в таблицу заносится id фильма, который скачали) 3112 строк.
mysql> desc moviez_rating; (в таблицу заносится id фильма и балл, поставленный пользователем) 6 строк.
mysql> desc moviez_partname; (таблица соответсвия id фильма (сериала) названию серии (части)) 116 строк.
Сам запрос (выводит список фильмов отсортированных по количеству скачиваний):
[SQL]SELECT
moviez.id_moviez,
...,
COUNT(DISTINCT(moviez_dl_count.id_mdl)) AS dlc
FROM
moviez
LEFT JOIN
moviez_dl_count
ON
moviez.id_moviez=moviez_dl_count.id_moviez
LEFT JOIN
moviez_rating
ON
moviez.id_moviez=moviez_rating.id_moviez
LEFT JOIN
moviez_partname
ON
moviez.id_moviez=moviez_partname.id_mv
GROUP BY
moviez_dl_count.id_moviez
ORDER BY
dlc DESC
LIMIT 50;[/SQL]
его EXPLAIN:
В итоге он исполняется 7 секунд.
Как его можно оптимизировать?
Таблицы:
mysql> desc moviez; (описание фильмов) 214 строк.
Код:
+----------------+----------------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------------+----------------------+------+-----+---------+-------+
| id_moviez | smallint(5) unsigned | NO | PRI | NULL | |
| orig_name | varchar(255) | NO | MUL | NULL | |
...
+----------------+----------------------+------+-----+---------+-------+
Код:
+-----------+----------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-----------+----------------------+------+-----+---------+----------------+
| id_mdl | int(10) unsigned | NO | PRI | NULL | auto_increment |
| id_moviez | smallint(5) unsigned | NO | MUL | NULL | |
...
+-----------+----------------------+------+-----+---------+----------------+
Код:
+-----------+----------------------+------+-----+---------------------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-----------+----------------------+------+-----+---------------------+----------------+
| id_mr | smallint(5) unsigned | NO | PRI | NULL | auto_increment |
| id_moviez | smallint(5) unsigned | NO | MUL | 0 | |
| vote | char(2) | YES | | 0 | |
...
+-----------+----------------------+------+-----+---------------------+----------------+
Код:
+---------------+-----------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+---------------+-----------------------+------+-----+---------+----------------+
| id_mvfn | mediumint(8) unsigned | NO | PRI | NULL | auto_increment |
| id_mv | smallint(5) unsigned | NO | MUL | NULL | |
| partname_orig | varchar(255) | NO | | NULL | |
| partname_rus | varchar(255) | NO | | NULL | |
| part | tinyint(3) unsigned | NO | | NULL | |
+---------------+-----------------------+------+-----+---------+----------------+
[SQL]SELECT
moviez.id_moviez,
...,
COUNT(DISTINCT(moviez_dl_count.id_mdl)) AS dlc
FROM
moviez
LEFT JOIN
moviez_dl_count
ON
moviez.id_moviez=moviez_dl_count.id_moviez
LEFT JOIN
moviez_rating
ON
moviez.id_moviez=moviez_rating.id_moviez
LEFT JOIN
moviez_partname
ON
moviez.id_moviez=moviez_partname.id_mv
GROUP BY
moviez_dl_count.id_moviez
ORDER BY
dlc DESC
LIMIT 50;[/SQL]
его EXPLAIN:
Код:
+----+-------------+-----------------+------+---------------+-----------+---------+------------------------+------+---------------------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-----------------+------+---------------+-----------+---------+------------------------+------+---------------------------------+
| 1 | SIMPLE | moviez | ALL | NULL | NULL | NULL | NULL | 214 | Using temporary; Using filesort |
| 1 | SIMPLE | moviez_dl_count | ref | id_moviez | id_moviez | 2 | w_pht.moviez.id_moviez | 7 | |
| 1 | SIMPLE | moviez_rating | ref | id_moviez | id_moviez | 2 | w_pht.moviez.id_moviez | 1 | |
| 1 | SIMPLE | moviez_partname | ref | id_mv | id_mv | 2 | w_pht.moviez.id_moviez | 19 | |
+----+-------------+-----------------+------+---------------+-----------+---------+------------------------+------+---------------------------------+
Как его можно оптимизировать?