与不存在功能相关的性能

时间:2019-04-22 10:10:30

标签: mysql

我有2个表a和b,每个表都有2 M和320万条记录。我正在尝试从a获取b中不存在的id。我在查询下面写了

com.android.tools.build:gradle:3.5.0-alpha09

这需要更长的时间。有什么更好的方法可以更快地获得结果。

更新:我只查看了两个表的表结构,发现表a.id具有十进制数据类型,表b.id具有varchar作为数据类型

数据类型的这种差异会导致任何问题。

4 个答案:

答案 0 :(得分:0)

您可以尝试将LEFT JOINNULL一起使用。它将返回TableA中存在的ID和TableB中不存在的ID。

SELECT T1.Id
FROM TableA T1
LEFT JOIN TableB T2 ON T2.Id = T1.Id
WHERE T2.Id IS NULL

答案 1 :(得分:0)

虽然可以使用反联接来编写查询,但它可能不会对性能产生太大影响,实际上,基础执行计划甚至可以相同。我可以看到加快查询速度的唯一方法是向public class TC1 { WebDriver driver; @Test public void testCaseOne() { // Printing Id of the thread on using which test method got executed System.setProperty("webdriver.chrome.driver", "your ChromeDriver path"); driver = new ChromeDriver(); driver.get("https://www.google.com"); } } 表添加索引:

b

但是,如果CREATE TABLE idx ON b (id); 是主键,则它应该已经是聚簇索引的一部分。在这种情况下,您当前的性能可能会达到您想要的水平。

答案 2 :(得分:0)

(这主要是评论,但有点长)

请花一些时间阅读关于查询优化的许多问题,这里是SO。那些被否决的和封闭的省略了表/索引的定义并解释了计划。将会收到投票的人包括基数,性能和结果指标。

子查询中表a的联接是多余的。当您删除对该表的第二个引用时,您将得到一个更简单的查询。然后,您可以使用“不在”或左联接。

但是性能仍然很糟糕。在数据设计中,应尽可能避免将自己画在这样的角落。

答案 3 :(得分:0)

感谢您的宝贵回答,我找到了解决之道。在为查找ID保留相同的数据类型后,解决了该问题,并在22秒内得到了结果。