MySQL不同版本之间的性能差异;从「;操作员使用

MySQL不同版本之间的性能差异;从「;操作员使用,mysql,sql,database,performance,database-schema,Mysql,Sql,Database,Performance,Database Schema,有人能给我解释一下为什么会这样: 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, na

有人能给我解释一下为什么会这样:

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*| |*选择|类型*| |*表格*| |*类型*| |*可能的|键*| |*键列*|*参考| |*行*| |*额外*||
||1 | | | | | | | | | | | | | | id | | | 12 | | | | 80407 |使用索引)||
||1 | | | | | | | | | | | | | | | | | 71038 | |在何处使用;使用连接缓冲区||
||2 | | | | | | | | | | | | | |索引4 | | 206 | | 71038 | |使用索引||
更新: A.id和B.id都是主键,而A.name是索引。两个表都有大约50000行(约15MB)。MySQL配置几乎是默认配置

不确定这是否有帮助(或者它是否增加了混乱-对我来说就是这样),但使用更通用的类似语句,可能有更多匹配字段(例如“LIKE“%x%”),会使第一个查询运行得更快。另一方面,使用“LIKE”%there no records matching this%”将使第二个查询速度大大加快(而第一个查询速度很慢)

有人能解释一下这里发生了什么吗

谢谢大家!

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

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

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


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

您选择的行数相同吗?比如说,我希望第一个可能比前20行查询更快,但是如果您得到了所有信息,那么优化器应该对这两行进行类似的处理。你的索引是什么?@Ben所有选定的字段都被索引。实际上,A.id和B.id都是唯一的主键,而A.name是一个简单的索引。是的,我也会假设第一个和第二个一样或者更快。但这不是我所看到的,这带来了所有的困惑。在我的表中,相应的执行时间是~3s vs~0.5s。表使用的是什么引擎?MySQL的版本是什么?
|| *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                     ||