作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有以下表格:
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 中的每一行对
整个过程在 25 秒内完成。我希望通过单个 SQL 查询获得相同类型的性能。bigtable
执行 SELECT
查询
最佳答案
查看优化器路径,哪个表为主源,好像比较慢,用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/
我是一名优秀的程序员,十分优秀!