2013-05-25 4 views
1

Я пытаюсь получить результаты от моего дб, я следующий запрос для него:НЕ В SQL слишком долго

SELECT dubaifirstuser.mobile, dubaifirstuser.email, CONCAT(user.fname, '', user.lname) AS Name, bank_master.bank_name, bank_master.image, user.createdon 
    FROM dubaifirstuser, user, bank_master 
    WHERE dubaifirstuser.mobile = user.mobile 
    AND bank_master.bank_id = user.bank_id 
    AND user.bank_id IN (16, 18) 
    AND user.createdon <= '2012-05-31' 
    AND dubaifirstuser.mobile NOT IN (SELECT mobile FROM renew_user 
); 

Но она принимает навсегда для выполнения, условие

AND dubaifirstuser.mobile NOT IN (SELECT mobile FROM renew_user 
); 

в основном занимает столько времени, что остальная часть запроса выполняется в секундах, так как у меня есть тысячи записей в таблице dubaifirstuser и renew_user, я пробовал NOT EXISTS вместо NOT IN все еще время исполнения навсегда, нет нулевой записи в обе вкладки ле. Пожалуйста, помогите, как получить записи быстрее или с меньшим временем выполнения?

+1

У вас есть какие-либо индексы, определенные в этих таблицах? – Oded

+0

@Oded: Нет, у меня нет указателей для этих таблиц. – saveATcode

+4

Время определить некоторые, то. – Oded

ответ

1

Используйте НЕЗАВИСИМОЕ СОЕДИНЕНИЕ вместо подзапроса NOT IN.

SELECT 
    dubaifirstuser.mobile, 
    dubaifirstuser.email, 
    CONCAT(user.fname, '', user.lname) AS Name, 
    bank_master.bank_name, 
    bank_master.image, 
    user.createdon 
    FROM dubaifirstuser 
    JOIN user ON dubaifirstuser.mobile = user.mobile 
    JOIN bank_master ON bank_master.bank_id = user.bank_id 
    LEFT JOIN renew_user ON renew_user.mobile = dubaifirstuser.mobile 
    WHERE 
    renew_user.mobile IS NULL 
    AND user.bank_id IN (16, 18) 
    AND user.createdon <= '2012-05-31'; 

Убедитесь, что составной индекс на столе пользователя по (bank_id, createdon, мобильный)

+0

Составной индекс является необязательным, но рекомендуется, если вы хотите, чтобы запрос был как можно быстрее. Он не будет замедлять вставки, чтобы добавить один индекс. Если вы заинтересованы в тестировании, не просто предполагайте, что он будет намного медленнее, если только он не сделает индексы больше доступной памяти. –

+0

Спасибо за помощь .. :) – saveATcode

1

В MySQL, альтернатива not in, который выполняет лучше использовать not exists. Ваш запрос:

dubaifirstuser.mobile NOT IN (SELECT mobile FROM renew_user) 

Вместо:

not exists (select 1 from renew_user ru where ru.mobile = dubaifirstuser.mobile) 

Производительность будет улучшена с показателем на renew_user(mobile). В первом запросе он сканирует renew_user для каждой оцениваемой строки. Снова и снова и снова.

Кстати, это проблема производительности со старыми версиями MySQL. Я считаю, что он был исправлен с момента выпуска 5.6.

+0

Я уже пробовал использовать 'not exist', как я упоминал в вопросе, это мало влияет, используя индексы, очевидно, быстро выполнит какие-либо операции, используя' not in' или 'not exists '. Спасибо за помощь. :) – saveATcode

Смежные вопросы