Привет у меня есть следующая таблица T:
id 1 2 3 4
col a b a c
Я хочу сделать выбор, который возвращает идентификатор, седло когда группа (седлом), имеющим количество (седло)> 1
Один способ сделать его
SELECT id,col FROM T
WHERE col IN (SELECT col FROM T GROUP BY(col) HAVING COUNT(col)>1);
Выбор интерна (справа) возвращается, и основной (слева) возвратится 1, a и 3, a
Проблема состоит в том, что, где в операторе, кажется, является чрезвычайно медленным. В моем реальном случае результаты внутреннего выбора имеют многих 'седло, что-то приблизительно 70 000, и требуются часы.
Прямо сейчас это намного быстрее, чтобы сделать внутренний выбор и основной выбор, получая все идентификаторы и upcs и сделать пересечение локально. MySQL должен смочь обработать этот вид запроса эффективно.
Я могу занять место где в для соединения или чего-то быстрее?
Спасибо
Вы можете попробовать, ускорит ли использование INNER JOIN
col
col, id
может дать вам еще лучшую производительностьSQL Statement
SELECT T.id, T.col
FROM T
INNER JOIN (
SELECT col
FROM T
GROUP BY col
HAVING COUNT(*) > 1
) tcol ON tcol.col = T.col
SELECT id, col
FROM t t1
WHERE EXISTS
(
SELECT NULL
FROM t t2
WHERE t2.col = t1.col
AND t2.id <> t1.id
)
Убедитесь, что у вас есть индекс в (столбец)
(в InnoDB
) или (столбец, идентификатор)
(в MyISAM
)
Внутренний запрос прекратит оценку, как только найдет первое совпадающее значение. В случае индекса это произойдет после одного поиска по индексу с максимум двумя сканированиями индекса.