首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么这个查询对一个表有效,而对另一个表超时

为什么这个查询对一个表有效,而对另一个表超时
EN

Stack Overflow用户
提问于 2012-11-13 13:08:40
回答 2查看 138关注 0票数 1

好的,我有3个表有问题:

代码语言:javascript
运行
复制
`eng` with column english
`jap` with column japanese
`eng-jap` with column eng and column jap

eng.english是一个独特的英语句子,jap.japanese是一个独特的日语句子,eng是一个包含一个日语和一个英语的翻译

我在这个问题的底部粘贴了更多表格的详细信息。

我的问题是:为什么……

此查询的运行速度很快:

代码语言:javascript
运行
复制
SELECT * FROM eng WHERE english IN (SELECT eng FROM `eng-jap`);

而这一次需要100秒或超时:

代码语言:javascript
运行
复制
SELECT * FROM jap WHERE japanese IN (SELECT jap FROM `eng-jap`);

(关于第二个查询的一个奇怪的注意是,如果我在phpmyadmin中执行,它需要100秒才能完成‘如果它完成了’,那么它将显示它花费了0.024秒。虽然它加载了100秒,但在我的网站上也需要100秒或超时)

所有这3个表的行数与您将从下面的数据中看到的行数大致相同。eng表和jap表特别相似。

我怀疑问题出在表设置或索引中的某个地方,所以现在我将粘贴所有相关的详细信息:

代码语言:javascript
运行
复制
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
EN

回答 2

Stack Overflow用户

发布于 2012-11-13 13:21:20

连接是否会加速您的查询?

代码语言:javascript
运行
复制
SELECT * 
FROM   jap a INNER JOIN `eng-jap` b ON
            a.japanses = b.jap
票数 0
EN

Stack Overflow用户

发布于 2012-11-13 14:18:28

我怀疑这是因为对涉及非拉丁字符的列进行了比较。这可能与db上定义的排序规则和字符集有关。尝试使用utf8_bin

代码语言:javascript
运行
复制
ALTER DATABASE `myDb` CHARACTER SET utf8 COLLATE 'utf8_bin';

二进制字符串比较更快,并且在您的情况下可能有意义。我确信在这种情况下,英语和日语的查询速度应该是一样的。

正如John指出的那样,也要使用JOIN

编辑:回答OP的评论,

代码语言:javascript
运行
复制
SELECT * FROM eng WHERE english NOT IN (SELECT eng FROM `eng-jap`);

可以更有效地编写为:

代码语言:javascript
运行
复制
SELECT * 
FROM   eng c 
WHERE  NOT EXISTS (SELECT * FROM `eng-jap` t WHERE c.english = t.eng);

代码语言:javascript
运行
复制
SELECT     c.* 
FROM       eng c 
LEFT JOIN `eng-jap` t ON c.english = t.eng 
WHERE      t.eng IS NULL;

我不能确定哪个运行得更快,我假设是JOIN,但在我的测试中,NOT EXISTS更快。可能是所有依赖于数据的东西。试试你自己吧。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13355875

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档