Существует простое требование, которое запрашивает сумму отношения Six Degrees из таблицы Friend
.Оптимизировать запрос MySQL с большим предложением in()
Структура Friend
такова:
+----------+---------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+----------+---------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| userId | int(11) | NO | MUL | NULL | |
| friendId | int(11) | NO | | NULL | |
+----------+---------+------+-----+---------+----------------+
Предположим, я хочу знать шесть степеней количество Взаимоотношение userId:1
, и я записал шесть запросов, как этот
SELECT friendId FROM Friend WHERE userId = 1
, чтобы получить один градусные друзей ,
Затем выполнить
SELECT friendId FROM Friend WHERE userId in (/*above query result*/)
пять раз.
Проблема не такая простая, как кажется, потому что у меня есть миллионы записей в таблице друзей.
Существует большая вероятность того, что размер отношений Six Degrees пользователя 1
больше шестизначных чисел, хотя у него есть только два друга в отношениях с одной степенью.
Количество элементов в предложении IN экспоненциально.
Затем шесть запросов занимают более одной минуты, чтобы получить результат.
Как оптимизировать эту ситуацию?
разместить Ваш запрос –
создать временную таблицу с индексом на объединенном столбце, а затем использовать JOIN вместо IN – Borjante
Этих может представлять интерес: [Задача, как реализовать алгоритм для шести степеней разделения?] (http://stackoverflow.com/questions/2076715/challenge-how-to-implement-an-algorithm-for-six-degree -of-разделение) – jpw