каскадный запрос резко замедляется, но они работают нормально независимо - PullRequest
0 голосов
/ 07 марта 2012

Запрос 1:

select distinct email from mybigtable where account_id=345

занимает 0,1 с

Запрос 2:

Select count(*) as total from mybigtable where account_id=123 and email IN (<include all from above result>)

занимает 0,2 с

Запрос 3:

Select count(*) as total from mybigtable where account_id=123 and email IN (select distinct email from mybigtable where account_id=345)

занимает 22 минуты и 90% - в состоянии «подготовка».Почему это занимает так много времени.

Таблица - это innodb с 3,2-миллионными строками в MySQL 5.0

Ответы [ 3 ]

0 голосов
/ 08 марта 2012

MySQL действительно плох в подзапросах в предложениях IN.Я бы переписал это как:

SELECT COUNT(*) as total
FROM mybigtable t
INNER JOIN (
    SELECT DISTINCT email
    FROM mybigtable
    WHERE account_id = 345
) x
ON t.email = x.email
WHERE t.account_id=123
0 голосов
/ 11 марта 2012

После долгих размышлений и с помощью dba.se это последний запрос, который сработал.

select count(*) EmailCount from
(
    select tbl123.email from
    (select email from mybigtable where account_id=123) tbl123
    LEFT JOIN
    (select distinct email from mybigtable where account_id=345) tbl345
    using (email)
    WHERE tbl345.email IS NULL
) A;
0 голосов
/ 07 марта 2012

Есть еще кое-что:

  1. Я подозреваю, что ваш кеш запросов был нагрет для запросов 1 и 2, что дает искаженные результаты.Повторите попытку после FLUSH QUERY CACHE;

  2. Я подозреваю, что Query 3 будет проходить через временную таблицу, наиболее вероятную на диске, в то время как Query 2 гарантированно будет работать из ОЗУ.Настройки по умолчанию для временных таблиц в my.cnf очень консервативны.

  3. Попробуйте сделать это, чтобы убедиться, что вы не столкнулись со старой ошибкой деоптимизации в MySQL

.

SELECT count(DISTINCT b.primary_key_column) AS total
FROM mybigtable a
INNER JOIN mybigtable b
ON a.email=b.email
WHERE a.account_id=345
AND b.account_id=123
...