Bermuda
Новичок
Как избавиться от "Using temporary" при запросе с COUNT() и GROUP BY. Оптимизация.
Есть пользователи
Есть группы пользователей
Между пользователями и группами отношение многие ко многим. Пользователи могут находится во многих группах, группы могут содержать несколько пользователей.
Хочу вывести список только тех групп в которых находится определенный пользователь. Также я хочу знать сколько в каждой группе есть пользователей.
Делаю вот так
Explain говорит, что "Using temporary"
Т. е. создается временная таблица.
При большом количестве записей в таблице создание временной будет длиться недопустимо долго.
Как оптимизировать запрос?
Есть пользователи
PHP:
CREATE TABLE users (
id int(10) NOT NULL auto_increment,
name varchar(255) NOT NULL,
PRIMARY KEY (id)
) ENGINE=MyISAM;
PHP:
CREATE TABLE groups (
id int(10) NOT NULL auto_increment,
name varchar(255) NOT NULL,
PRIMARY KEY (id),
KEY id (id)
) ENGINE=MyISAM;
PHP:
CREATE TABLE groups_users (
group_id int(10) NOT NULL,
user_id int(10) NOT NULL,
UNIQUE KEY group_user (group_id, user_id),
KEY group_id (group_id),
KEY user_id (user_id)
) ENGINE=MyISAM;
Делаю вот так
PHP:
SELECT
groups.id,
groups.name,
COUNT(members.user_id)
FROM groups_users
LEFT JOIN groups ON groups_users.group_id = groups.id
LEFT JOIN groups_users as members ON groups.id = members.group_id
WHERE groups_users.user_id = '1'
GROUP BY groups.id
ORDER BY NULL
PHP:
+--+-----------+------------+------+-------------------+----------+-------+----------------------------+----+---------------+
|id|select_type| table | type | possible_keys | key |key_len| ref |rows| Extra |
+--+-----------+------------+------+-------------------+----------+-------+----------------------------+----+---------------+
|1 | SIMPLE |groups_users|ref |user_id |user_id | 4 |const | 4 |Using temporary|
|1 | SIMPLE |groups |eq_ref|PRIMARY,id |PRIMARY | 4 |mvc3_3.groups_users.group_id| 1 | |
|1 | SIMPLE |members |ref |group_user,group_id|group_user| 4 |mvc3_3.groups.id | 1 |Using index |
+--+-----------+------------+------+-------------------+----------+-------+----------------------------+----+---------------+
При большом количестве записей в таблице создание временной будет длиться недопустимо долго.
Как оптимизировать запрос?