Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 为什么此查询在一个表中工作,而在另一个表中超时_Mysql_Database_Indexing - Fatal编程技术网

Mysql 为什么此查询在一个表中工作,而在另一个表中超时

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 (

好的,我有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 (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-JOIN
eng-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;