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

标签 mysql sql performance select

我是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

请求它的目的是测试我的数据库,并处理我想选择 emailnamecountry 的进一步请求> 来自 表 1,其中 table1.email 不在 table2 中。

对不起我的英语不好,而且我的水平,正如我之前所说的,我是初学者和自学的。

如果有人能帮助我或至少启发我,我将非常感谢您的宝贵时间。

编辑:我不是很清楚,但我正在处理一个有 20 000 多行的表。

最佳答案

这是您的查询(使用表别名进行了一些修改):

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);

关于mysql - 如何使我的 SELECT 查询更有效率?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33960094/

相关文章:

java - Sql事件与Servlet中的ScheduledExecutorService

mysql - 快速查询选择不在 MySQL 中另一个表中的所有记录

javascript - 在 JavaScript 中对 32 位有符号整数数组进行排序的最快方法?

php - WordPress 中的自定义表查询

mysql - MySQL 中的索引(唯一,写入语句)

java - 元数据库过滤器示例

c# - 如何将变量传递到 SqlCommand 语句并插入到数据库表中

sql命令占用大量空间

sql - 如何更新 SQL Server 中 ntext 列中的 XML 字符串?

java - 整数集。在增加新条目的情况下可能会提高性能