gpt4 book ai didi

java - 为什么mysql inner join查询需要那么多时间

转载 作者:搜寻专家 更新时间:2023-10-30 22:22:16 25 4
gpt4 key购买 nike

在mysql中我有两个表

表A

col1   col2  SIM1 ..........col24
-----------------------------------
a x 1 5
b y 1 3
c z 0 2
d g 2 1

表B

colA   colB   SIM2
-------------------
x g 1
y f 0
x s 0
y e 2

实际两张表的记录数在40万

我有一个 java 程序,我正在使用 jdbc 从中执行 sql 查询。

这里是查询

     SELECT * 
FROM TableA
INNER JOIN TableB ON TableA.SIM1 = TableB.SIM2
INTO OUTFILE 'c:/test12226.csv' "+
FIELDS TERMINATED BY ','
ENCLOSED BY '\"'
LINES TERMINATED BY '\n'

这个查询花费了很长时间。为了使我的应用程序可行,这不应超过 30 秒。我知道记录是 40 万条,但在 MS Access 中执行此类操作不到 10 秒。 java-mysql 组合是否比 ms-access 更耗时

我在调试配置中分配了 1GB 内存。请提出建议。

最佳答案

我的猜测是 TableA.SIM1TableB.SIM2 之一或两者未编入索引。或者它们是不同的数据类型(例如 VARCHARNUMERIC)。尝试:

CREATE INDEX index_name1 ON TableA (SIM1);
CREATE INDEX index_name2 ON TableB (SIM2);

如果没有索引,查询会非常慢。一张表将逐条记录访问,这很好,因为您正在输出整个表。要在另一个表中找到对应的记录,需要根据SIM1 = SIM2关系查找。

要在没有索引的情况下在另一个表中查找记录,它必须查看每条记录。这是一个线性或 O(n) 查找。在每个表中放入 50 万条记录,这需要进行大量比较才能找到所有匹配项(实际上是数十亿条)。

有了索引,记录匹配几乎是即时的。

这样想:索引列就像按字母顺序排列电话簿。这使得查找姓氏变得容易。如果电话簿根本没有分类,您要花多长时间才能找到某人的电话号码?

现在将其乘以 50 万。

关于java - 为什么mysql inner join查询需要那么多时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1905515/

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