使用自联接优化缓慢的MySQL查询

时间:2016-01-25 09:45:10

标签: mysql join optimization self-join

我的数据结构如下:

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

我使用以下查询将所有祖先返回到搜索词之上的两个级别(即仅返回父级和祖父母)。

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显示:

enter image description here

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

编辑:这是表结构:

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

2 个答案:

答案 0 :(得分:0)

您的查询没问题。它使用bcUSING INDEX)的相应索引,但可能但是可以通过添加覆盖索引来改进

(`a.`.parent, a.`child`)

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

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

答案 1 :(得分:0)

  1. LIKE=
  2. COLLATE utf8mb4_unicode_520_ciparent设置child,如果您想要'类似'要处理的字符相等。或者使用COLLATE utf8mb4_general_ci使他们不平等Example of such