mysql - 使用自连接优化慢速 MySQL 查询

标签 mysql join optimization self-join

我的数据结构如下:

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

我正在使用以下查询来返回搜索词以上两个级别的所有祖先(即,仅返回 parent 和祖 parent )。

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

最佳答案

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

关于mysql - 使用自连接优化慢速 MySQL 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34989391/

相关文章:

mysql - 使用子查询的平均值

sql - SELECT 语句帮助

php - in_array() 性能优化

c++ - 为什么 GCC 不能优化 `std::sqrt` ?

mysql - 如何将 MySQL CLI 查询输出转换为 CSV

php - 单击按钮将 mysql 查询导出到 csv

mysql - 这个 MySql 连接字符串有什么问题

sql - 如何根据列值进行条件连接

mysql 计数,不同,加入?困惑

javascript - 当需要单独的函数调用时,如何优化/避免 JavaScript 中的切换条件