好的,我有3个表有问题:
`eng` with column english
`jap` with column japanese
`eng-jap` with column eng and column japeng.english是一个独特的英语句子,jap.japanese是一个独特的日语句子,eng是一个包含一个日语和一个英语的翻译
我在这个问题的底部粘贴了更多表格的详细信息。
我的问题是:为什么……
此查询的运行速度很快:
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秒或超时)
所有这3个表的行数与您将从下面的数据中看到的行数大致相同。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发布于 2012-11-13 13:21:20
连接是否会加速您的查询?
SELECT *
FROM jap a INNER JOIN `eng-jap` b ON
a.japanses = b.jap发布于 2012-11-13 14:18:28
我怀疑这是因为对涉及非拉丁字符的列进行了比较。这可能与db上定义的排序规则和字符集有关。尝试使用utf8_bin。
ALTER DATABASE `myDb` CHARACTER SET utf8 COLLATE 'utf8_bin';二进制字符串比较更快,并且在您的情况下可能有意义。我确信在这种情况下,英语和日语的查询速度应该是一样的。
正如John指出的那样,也要使用JOIN。
编辑:回答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);或
SELECT c.*
FROM eng c
LEFT JOIN `eng-jap` t ON c.english = t.eng
WHERE t.eng IS NULL;我不能确定哪个运行得更快,我假设是JOIN,但在我的测试中,NOT EXISTS更快。可能是所有依赖于数据的东西。试试你自己吧。
https://stackoverflow.com/questions/13355875
复制相似问题