2

我正在尝试从我的数据库中获取结果,我有以下查询:

  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执行时间是永远的,两个表中都没有空记录。请帮助如何更快地或以更少的执行时间获取记录?

4

2 回答 2

2

使用 OUTER JOIN 而不是 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,mobile) 上的用户表上有一个复合索引

于 2013-05-25T07:48:58.907 回答
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 版本以来已得到修复。

于 2013-05-25T13:01:50.620 回答