繁体   English   中英

如何使我的SELECT查询更有效?

[英]How to make my SELECT query more efficient?

我是SQL的初学者,我对这个请求有些麻烦,因为效率太低而无法执行。 在这里,它只是加载几个小时(!)

SELECT my_db_client_total.email as EMAIL_TOTAL, 
    my_db_client_total.name, my_db_client_total.country 
    FROM my_db_client_total, my_db_client_pro
      WHERE (my_db_client_total.email<>'' ) 
    AND (my_db_client_total.country = '120') 
    AND (my_db_client_total.email IN (SELECT my_db_client_pro.email 
    FROM my_db_client_pro));

我的表以这种方式组织:

Table 1 :        Table 2 :
   email         email
   name          name
   country       country

请求它测试我的数据库的目的,并处理我想从Table 1中选择emailnamecountry的进一步请求,其中table1.email不在table2

抱歉我的英语不好,而且就我的水平而言,正如我之前所说,我是一名初学者并且自学成才。

如果有人能帮助我或至少启发我,我会非常感谢你的时间。

编辑:我不知道,但我正在使用一个有2万多行的表。

你的问题表明你正在使用MySQL,所以这会给你一个内部(记录必须存在于两个表中)加入。

SELECT my_db_client_total.email as EMAIL_TOTAL, my_db_client_total.name, my_db_client_total.country 
FROM my_db_client_total inner join my_db_client_pro on my_db_client_pro.email = my_db_client_total.email
WHERE (my_db_client_total.email<>'' ) AND (my_db_client_total.country = '120');

要选择另一个表中不存在的行,请执行以下操作:

SELECT my_db_client_total.email as EMAIL_TOTAL, my_db_client_total.name, my_db_client_total.country 
FROM my_db_client_total LEFT OUTER JOIN my_db_client_pro on my_db_client_pro.email = my_db_client_total.email
WHERE (my_db_client_total.email<>'' ) AND (my_db_client_total.country = '120') AND my_db_client_pro.email IS NULL;

这是您的查询(使用表别名修复了一下):

SELECT ct.email as EMAIL_TOTAL, ct.name, ct.country
FROM my_db_client_total ct 
WHERE (ct.email <> '' ) AND
      (ct.country = 120) AND 
      (ct.email IN (SELECT my_db_client_pro.email FROM my_db_client_pro));

(我假设120实际上是一个整数。)

在旧版本的MySQL中, existsin更高效,因此将查询重写为:

SELECT ct.email as EMAIL_TOTAL, ct.name, ct.country
FROM my_db_client_total ct 
WHERE (ct.email <> '' ) AND
      (ct.country = 120) AND 
      EXISTS (SELECT 1 FROM my_db_client_pro cp WHERE cp.email = ct.email);

接下来,考虑索引。 对于此查询,好的索引是:

create index idx_my_db_client_total_2 on my_db_client_total(country, email, name);

create index idx_my_db_client_pro_email on my_db_client_pro(email);
SELECT my_db_client_total.email as EMAIL_TOTAL, 
  my_db_client_total.name, my_db_client_total.country 
FROM 
  my_db_client_total, 
WHERE (my_db_client_total.email <> '') 
AND (my_db_client_total.country = '120') 
AND (my_db_client_total.email not IN (SELECT my_db_client_pro.email
  FROM my_db_client_pro));

基本上从表中获取所有数据以及获取电子邮件地址的条件不在表2中

你应该使用Join

在这里查看它们: https//technet.microsoft.com/en-us/library/ms191472(v = sql.105).aspx

示例代码:

SELECT my_db_client_total.email as EMAIL_TOTAL, my_db_client_total.name, my_db_client_total.country
FROM my_db_client_total AS ct
    CROSS JOIN my_db_client_pro AS cp
    ON ct.CLIENT_ID = cp.CLIENT_ID

如果您加入2个表,为什么不在查询中使用右侧表而不是在其上创建子查询?

试试这个(只有连接):

SELECT my_db_client_total.email as EMAIL_TOTAL, my_db_client_total.name, my_db_client_total.country 
  FROM my_db_client_total, my_db_client_pro
 WHERE my_db_client_total.email <> ''
   AND my_db_client_total.country = '120'
   AND my_db_client_total.email = my_db_client_pro.email;

或者这个(只有子查询):

SELECT my_db_client_total.email as EMAIL_TOTAL, my_db_client_total.name, my_db_client_total.country 
  FROM my_db_client_total
 WHERE my_db_client_total.email <> ''
   AND my_db_client_total.country = '120' 
   AND my_db_client_total.email IN (SELECT my_db_client_pro.email FROM my_db_client_pro);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM