使用 self-joins 优化慢速 MySQL 查询

Optimizing a slow MySQL query with self-joins

我的数据结构如下:

Parent   |    Child
散       |    ⺙
⺙       |    
⺙       |    乂
散       |    龷
散       |    月

我正在使用以下查询 return 搜索词以上两个级别的所有祖先(即,仅 return parents 和 grandparents) .

SELECT a.parent AS level3, b.parent AS level2, c.parent AS level1
FROM decomposition_dup AS a
LEFT JOIN decomposition_dup AS b ON a.parent LIKE b.child
LEFT JOIN decomposition_dup AS c ON b.parent LIKE c.child
WHERE a.child LIKE '$searchterm'

问题是查询速度很慢(~5 秒)。我的 EXPLAIN 显示:

我已经为相应的列编制了索引。我犯了错误吗?或者是否有更好的方法来构建我的查询?

编辑:这是 table 结构:

CREATE TABLE `decomposition_dup` (
 `id` int(11) NOT NULL AUTO_INCREMENT,
 `parent` varchar(50) COLLATE utf8mb4_unicode_ci NOT NULL,
 `structure` varchar(50) COLLATE utf8mb4_unicode_ci NOT NULL,
 `child` varchar(50) COLLATE utf8mb4_unicode_ci NOT NULL,
 PRIMARY KEY (`id`),
 KEY `parent` (`parent`),
 KEY `child` (`child`),
 KEY `parent_2` (`parent`,`child`)
) ENGINE=InnoDB AUTO_INCREMENT=211929 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci

您的查询没问题。它为 bc (USING INDEX) 使用适当的索引,但是 可能 但是可以通过在

上添加覆盖索引来改进
(`a.`.parent, a.`child`)

我的推测是投影阶段需要很长时间,而不是计算时间(因为有很多记录要输出)。你可以自己查一些mysql profiling.


关于 LIKE= 行为 'problem',我自己最近 运行 遇到了同样的问题,您可能会喜欢进一步阅读

  1. LIKE=
  2. 如果您希望 'similar' 个字符被视为 等同 ,请在 parentchild 上设置 COLLATE utf8mb4_unicode_520_ci。或者使用 COLLATE utf8mb4_general_ci 使它们 不相等