gpt4 book ai didi

MySQL:从小表到大表的连接性能不佳

转载 作者:行者123 更新时间:2023-11-29 03:23:31 24 4
gpt4 key购买 nike

我有以下表格:

CREATE TABLE smalltable (
smalltable_id VARCHAR(64) NOT NULL,
bigtable_id VARCHAR(64),
...
PRIMARY KEY (smalltable_id)
) ENGINE=InnoDB;

CREATE TABLE bigtable (
bigtable_id VARCHAR(64) NOT NULL,
count BIGINT,
PRIMARY KEY (bigtable_id)
) ENGINE=InnoDB;

smalltable 有大约 8000 行,bigtable 大约有 4000 万行。我想从 smalltable 中检索那些行,其中 smalltable.bigtable_id 存在于 bigtable 中。以下查询用了将近 10 个小时才完成:

SELECT * FROM smalltable
INNER JOIN bigtable
ON smalltable.bigtable_id = bigtable.bigtable_id;

这是 EXPLAIN 的输出:

*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: smalltable
partitions: NULL
type: ALL
possible_keys: NULL
key: NULL
key_len: NULL
ref: NULL
rows: 8610
filtered: 100.00
Extra: NULL
*************************** 2. row ***************************
id: 1
select_type: SIMPLE
table: bigtable
partitions: NULL
type: ALL
possible_keys: NULL
key: NULL
key_len: NULL
ref: NULL
rows: 38818260
filtered: 100.00
Extra: Using where; Using join buffer (Block Nested Loop)

我不是解释这个的专家,但看起来 MySQL 正在对两个表进行顺序扫描。如果我编写一个小的 Python 脚本来遍历 smalltable 中的所有行,并针对 smalltable 中的每一行对 bigtable 执行 SELECT 查询 整个过程在 25 秒内完成。我希望通过单个 SQL 查询获得相同类型的性能。

最佳答案

查看优化器路径,哪个表为主源,好像比较慢,用bigtable为主源。试试这个:

SELECT STRAIGHT_JOIN * FROM smalltable
INNER JOIN bigtable
ON smalltable.bigtable_id = bigtable.bigtable_id;

使用 STRAIGHT_JOIN 将告诉 mysql 遵循查询中表的顺序。

关于MySQL:从小表到大表的连接性能不佳,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40107649/

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