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 ||