我是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
请求它的目的是测试我的数据库,并处理我想选择 email
、name
和 country
的进一步请求> 来自 表 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 中,exists
比 in
更高效,因此将查询重写为:
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/