Mysql 为什么此查询在一个表中工作,而在另一个表中超时
好的,我有3张表有问题:Mysql 为什么此查询在一个表中工作,而在另一个表中超时,mysql,database,indexing,Mysql,Database,Indexing,好的,我有3张表有问题: `eng` with column english `jap` with column japanese `eng-jap` with column eng and column jap 英语是一个独特的英语句子, 日语是一个独特的日语句子, eng-jap是一个翻译版本,包含一个来自日本的日语和一个来自英语的英语 我把表格的更多细节贴在这个问题的底部 我的问题:为什么 此查询的工作速度非常快: SELECT * FROM eng WHERE english IN (
`eng` with column english
`jap` with column japanese
`eng-jap` with column eng and column jap
英语是一个独特的英语句子,
日语是一个独特的日语句子,
eng-jap是一个翻译版本,包含一个来自日本的日语和一个来自英语的英语
我把表格的更多细节贴在这个问题的底部
我的问题:为什么
此查询的工作速度非常快:
SELECT * FROM eng WHERE english IN (SELECT eng FROM `eng-jap`);
这一次需要100秒或超时:
SELECT * FROM jap WHERE japanese IN (SELECT jap FROM `eng-jap`);
(关于第二个查询,一个奇怪的注意事项是,如果我在phpmyadmin中执行,它需要100秒才能完成“如果它完成”,那么它会说它需要0.024秒。虽然它加载了100秒,但在我的网站上也需要100秒或超时)
所有这三个表的行数与您将从下面的数据中看到的大致相同。eng和jap表格特别相似
我怀疑问题出在表设置或索引或其他地方,因此我现在将粘贴所有相关详细信息:
JAP TABLE:
Keyname Type Unique Packed Column Cardinality Collation
PRIMARY BTREE Yes No ID 130296 A
full BTREE Yes No japanese 130296 A
Format dynamic
Collation utf8_general_ci
Rows 130,296
Row length ø 264
Row size ø 372 B
Next Autoindex 131,790
Type Usage
Data 33,718.6 KiB
Index 13,652.0 KiB
Total 47,370.6 KiB
ENG TABLE:
Keyname Type Unique Packed Column Cardinality Collation
PRIMARY BTREE Yes No ID 129637 A
full BTREE Yes No english 129637 A
Format dynamic
Collation utf8_general_ci
Rows 129,637
Row length ø 101
Row size ø 181 B
Next Autoindex 130,749
Data 12,899.3 KiB
Index 10,068.0 KiB
Total 22,967.3 KiB
ENG_JAP TABLE:
Keyname Type Unique Packed Column Cardinality Collation
PRIMARY BTREE Yes No ID 139442 A
eng BTREE Yes No eng (150) 0 A
jap (150) 139442 A
Format dynamic
Collation utf8_general_ci
Rows 139,442
Row length ø 315
Row size ø 468 B
Next Autoindex 140,951
Data 42,945.5 KiB
Index 20,816.0 KiB
Total 63,761.5 KiB
加入会加速你的查询吗
SELECT *
FROM jap a INNER JOIN `eng-jap` b ON
a.japanses = b.jap
我怀疑这是因为比较了非拉丁字符的列。这可能与数据库中定义的排序规则和字符集有关。尝试使用
utf8\u bin
ALTER DATABASE `myDb` CHARACTER SET utf8 COLLATE 'utf8_bin';
二进制字符串比较更快,在您的情况下可能有意义。我相信在这种情况下,英语和日语的查询速度应该是一样的
正如John指出的,也可以使用JOIN
s
编辑:回答OP的评论
SELECT * FROM eng WHERE english NOT IN (SELECT eng FROM `eng-jap`);
可以更有效地写为:
SELECT *
FROM eng c
WHERE NOT EXISTS (SELECT * FROM `eng-jap` t WHERE c.english = t.eng);
或
我不能确定哪一个更快,我假设
JOIN
,但在我的测试中不存在
更快。可能是所有依赖于数据的内容。试试你自己 请为这两个查询添加解释计划以消除任何猜测工作:)它说您的查询中有一个synthax错误John,我不知道如何修复它,因为我从未使用过内部连接抱歉,我忘了在上插入。再试一次。我能够研究内部连接,令人惊讶的是,它使jap查询像英语查询一样快速工作。我想如果它比我现在的查询速度快,我会在我的where in quiries上实现它。然而,虽然我有一个解决问题的方法,但我仍然想知道为什么我的一个旧查询有效,而另一个查询无效。我还需要使用“WHERE NOT IN”,那么我如何使用JOIN实现这种“反向”呢?我试着在jap
上执行SELECT*FROM-jap-internal-JOINeng-jap
日语!=eng-jap
.jap”但它不喜欢不平等sythax@user1397417我更新了我的答案。如果使用为NULL
语法,则有点棘手。这是一种INTERSECT
/,除了MySQL中缺少的
功能之外,所以我们必须用LEFT手动完成JOINS@user1397417因此,答案应针对张贴的问题。您现在所问的应该是一个单独的问题,尽管我已经编辑了我的答案。@user1397417我很想知道您是否更改了数据库的排序规则,以及它是否有帮助!请回复:)
SELECT c.*
FROM eng c
LEFT JOIN `eng-jap` t ON c.english = t.eng
WHERE t.eng IS NULL;