有人可以向我解释为什么会这样:
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%'"将使第二个查询更快(而第一个查询很困难)。
任何人都可以了解这里发生了什么?
谢谢!