我的数据结构如下:
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
显示:
我已经为相应的列编制了索引。我犯了错误吗?还是有更好的方法来构建我的查询?
编辑:这是表结构:
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
最佳答案
LIKE
到=
- 如果您希望“相似”字符被视为相同,请在
parent
和child
上设置COLLATE utf8mb4_unicode_520_ci
。或者使用COLLATE utf8mb4_general_ci
使它们不相等。 Example of such
关于mysql - 使用自连接优化慢速 MySQL 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34989391/