gpt4 book ai didi

mysql - 加快选择在另一个表中存在列条件而没有重复项的位置

转载 作者:可可西里 更新时间:2023-11-01 06:38:18 25 4
gpt4 key购买 nike

如果我有以下两个表:

  1. 表“a”有 2 列:id (int) [Primary Index],column1 [Indexed]
  2. 表“b”有 3 列:id_table_a (int),condition1 (int),condition2 (int) [所有列作为主索引]

我可以运行以下查询来从表 a 中选择表 b 条件 1 为 1 的行

SELECT a.id FROM a WHERE EXISTS (SELECT 1 FROM b WHERE b.id_table_a=a.id && condition1=1 LIMIT 1) ORDER BY a.column1 LIMIT 50

由于两个表中都有几亿行,此查询非常慢。如果我这样做:

SELECT a.id FROM a INNER JOIN b ON a.id=b.id_table_a && b.condition1=1  ORDER BY a.column1 LIMIT 50

这几乎是即时的,但如果表 b 中有多个匹配行与 id_table_a 匹配,则返回重复项。如果我执行 SELECT DISTINCT 或 GROUP BY a.id 来删除重复项,查询会变得非常慢。

这是一个显示示例查询的 SQLFiddle:http://sqlfiddle.com/#!9/35eb9e/10

在这种情况下,有没有办法快速进行不重复的连接?

*编辑以表明 INNER 而不是 LEFT join 没有太大区别

*经过编辑以显示加入的移动条件并没有太大的区别

*编辑以添加 LIMIT

*编辑以添加 ORDER BY

最佳答案

你可以试试内连接和不同

SELECT distinct a.id 
FROM a INNER JOIN b ON a.id=b.id_table_a AND b.condition1=1

但是在 select 上使用 distinct * 确保你没有在这种情况下返回错误结果的 distinct id

SELECT distinct col1, col2, col3 .... 
FROM a INNER JOIN b ON a.id=b.id_table_a AND b.condition1=1

您还可以使用 condtition1 添加复合索引,例如:key(id, condition1)

如果可以的话,你也可以执行一个

 ANALYZE TABLE table_name; 

在两个表上..

另一种技术是尝试还原引导表

SELECT distinct a.id 
FROM b INNER JOIN a ON a.id=b.id_table_a AND b.condition1=1

使用最有选择性的表来引导查询

使用这似乎与索引 http://sqlfiddle.com/#!9/35eb9e/15 的使用不同(最后加一个using where)

# USING DISTINCT TO REMOVE DUPLICATES without col  and order 
EXPLAIN
SELECT DISTINCT a.id
FROM a
INNER JOIN b ON a.id=b.id_table_a AND b.condition1=1
;

关于mysql - 加快选择在另一个表中存在列条件而没有重复项的位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38681675/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com