3

有人可以向我解释为什么会这样:

SELECT 
    A.id,
    A.name,
    B.id AS title_id
FROM title_information AS A
JOIN titles B ON B.title_id = A.id
WHERE
    A.name LIKE '%testing%'

比这慢得多(6-7倍):

SELECT 
    A.id,
    A.name,
    B.id AS title_id
FROM (SELECT id, name FROM title_information) AS A
JOIN titles B ON B.title_id = A.id
WHERE
    A.name LIKE '%testing%'

我知道在不了解有关架构和 MySQL 配置的完整详细信息的情况下可能很难回答这个问题,但我正在寻找任何一般原因,为什么第一个示例可能比第二个示例慢得多?

运行 EXPLAIN 给出了这个:

|| *id* || *select_type* || *table*  || *type*  || *possible_keys*           || *key*   || *key_len* || *ref*             || *rows* || *Extra*     ||
|| 1    || SIMPLE        || B        || index   ||                           || id      || 12        ||                   || 80407  || Using index ||
|| 1    || SIMPLE        || A        || eq_ref  || PRIMARY,id_UNIQUE,Index 4 || PRIMARY || 4         || newsql.B.title_id || 1      || Using where ||

|| *id* || *select_type* || *table*           || *type* || *possible_keys* || *key*   || *key_len* || *ref* || *rows* || *Extra*                         ||
|| 1    || PRIMARY       || B                 || index  ||                 || id      || 12        ||       || 80407  || Using index                     ||
|| 1    || PRIMARY       || <derived2>        || ALL    ||                 ||         ||           ||       || 71038  || Using where; Using join buffer  ||
|| 2    || DERIVED       || title_information || index  ||                 || Index 4 || 206       ||       || 71038  || Using index                     ||

更新: A.id 和 B.id 都是主键,而 A.name 是索引。两个表都有大约 50,000 行 (~15MB)。MySQL 配置几乎是默认配置。

不确定这是否有帮助(或者它是否会增加更多的混乱 - 就像它对我一样),但使用可能有更多匹配字段的更通用的 LIKE 语句(例如"LIKE '%x%'")进行第一个查询跑得更快。另一方面,使用"LIKE '%there are no records matching this%'"将使第二个查询更快(而第一个查询很困难)。

任何人都可以了解这里发生了什么?

谢谢!

4

1 回答 1

0

这是推测(我阅读 MySQL 解释输出的能力比应有的弱,因为我想查看数据流图)。

但这就是我认为正在发生的事情。第一个查询是说“让我们通过 B 并在 A 中查找适当的值”。然后它使用索引查找适当的值id,然后它需要获取页面并与name. 这些访问效率低下,因为它们不是顺序的。

第二个版本似乎承认条件name很重要。它正在遍历nameA 上的索引,并且仅根据需要获取匹配的行。这更快,因为数据在索引中,并且匹配名称只需要很少的页面。与 B 的匹配非常简单,只有一行要匹配。

我对性能差异感到惊讶。通常,派生表在性能方面很差,但这显然是一个例外。

于 2013-09-03T21:38:58.113 回答