Mysql 为什么向用于连接两个表的两个键之一添加索引会使执行时间比根本不使用任何索引慢?

Mysql 为什么向用于连接两个表的两个键之一添加索引会使执行时间比根本不使用任何索引慢?,mysql,sql,indexing,Mysql,Sql,Indexing,我正在执行两个表authors和work_authors连接的查询。我正在使用MySQL。作者和作品作者之间有一对多的关系,作者包含约700万条记录,作品作者包含约2100万条记录 SELECT t2.author_id, t1.work_id, t2.name FROM work_author AS t1, authors AS t2 WHERE t1.author_id = t2.id AND t2.name LIKE '%Tolkien%'

我正在执行两个表authors和work_authors连接的查询。我正在使用MySQL。作者和作品作者之间有一对多的关系,作者包含约700万条记录,作品作者包含约2100万条记录

SELECT  t2.author_id, t1.work_id, t2.name 
FROM    work_author AS t1, 
        authors AS t2 
WHERE   t1.author_id = t2.id AND
        t2.name LIKE '%Tolkien%';
首先,数据库中根本没有索引,即没有主键或其他索引。然后在我的机器上查询平均需要24秒。添加索引时,即使authors的id列成为主键,而不是work_author表的任何索引或主键,查询在我的计算机上平均需要64秒

其次,当我向列author\u id添加一个非唯一索引到work\u author表时,在我的机器上查询平均需要4秒钟


这怎么可能呢?为什么将索引添加到用于连接的属性之一时,查询花费的时间要比没有索引时长?然后,当向两个连接键添加索引时,它的执行速度比其他两个选项快。任何能解释这一点的人?

没有像“%Tolkien%”这样的索引可以帮助
。然而

考虑将
全文
索引添加到
作者。名称
并使用

MATCH(name) AGAINST('+Tolkein' IN BOOLEAN MODE)
这将运行得更快

主键
很重要

使用InnoDB很重要

请使用
JOIN…ON
语法而不是逗号


多对多表通过使用两个索引进行优化,如下所述:

索引使用效率取决于表统计。如果符合条件的行数超过约5-7%,则表扫描通常比索引使用更有效。请尝试创建索引
作者(姓名、id)
。或覆盖索引
作者(姓名、id、作者id)
。还要测试
作者(id,name)
作者(id,name,author\u id)
。更容易写(没有错误),更容易阅读和维护,如果需要,更容易转换为外部连接!提示2:t1和t2是糟糕的表别名。选择一些有意义的东西,比如为
work\u author
选择
wa
,为
authors
@Akina选择
a
,你能详细介绍一下你的第一条评论吗?“符合条件的行数超过约5-7%”是什么意思?