Альтернатива, 'где седло в (списке)' для MySQL

Привет у меня есть следующая таблица 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 должен смочь обработать этот вид запроса эффективно.

Я могу занять место где в для соединения или чего-то быстрее?

Спасибо

5
задан lexu 19 March 2010 в 13:50
поделиться

2 ответа

Вы можете попробовать, ускорит ли использование 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
5
ответ дан 14 December 2019 в 08:47
поделиться
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 )

Внутренний запрос прекратит оценку, как только найдет первое совпадающее значение. В случае индекса это произойдет после одного поиска по индексу с максимум двумя сканированиями индекса.

2
ответ дан 14 December 2019 в 08:47
поделиться
Другие вопросы по тегам:

Похожие вопросы: