You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

多LIKE谓词SQL查询优化:模糊匹配人员数据提取慢问题

优化SQL查询的几个实用建议

嘿,作为SQL新手能写出逻辑正确的查询已经很棒了!针对你这个查询耗时4秒的问题,咱们可以从几个方向来优化,让它跑得更快:

1. 用UNION拆分多条件查询,替代多表LEFT JOIN+OR

你当前的查询用了多个LEFT JOIN加上OR条件,这种写法很容易让数据库无法高效利用索引,甚至产生大量不必要的笛卡尔积。咱们可以把三个条件拆成三个独立的子查询,再用UNION合并结果——因为UNION会自动去重,刚好符合你DISTINCT的需求。

优化后的SQL示例:

SELECT p.ID_PERSONNE, p.PER_NOM, p.PER_PRENOM
FROM personne p
INNER JOIN instance_fiche_personnalisee ifp ON p.id_personne = ifp.id_patient
INNER JOIN datas_instance_fiche_perso difp ON ifp.id_instance = difp.id_instance
WHERE LOWER(difp.valeur_lisible) LIKE '%gingivite%'

UNION

SELECT p.ID_PERSONNE, p.PER_NOM, p.PER_PRENOM
FROM personne p
INNER JOIN objet o ON o.id_patient = p.id_personne
INNER JOIN lnk_attributs_objets lao ON o.pk_objet = lao.id_objet
WHERE LOWER(lao.valeur) LIKE '%gingivite%'

UNION

SELECT p.ID_PERSONNE, p.PER_NOM, p.PER_PRENOM
FROM personne p
INNER JOIN objet o ON o.id_patient = p.id_personne
INNER JOIN lnk_attributs_objets lao ON o.pk_objet = lao.id_objet
INNER JOIN attributs a ON lao.id_attribut = a.pk_attribut
WHERE LOWER(a.nom) LIKE '%gingivite%'

为什么这样更好?每个子查询只处理一个匹配条件,数据库可以针对每个子查询做更精准的优化,避免了多表连接后再过滤的冗余操作。

2. 添加针对性的函数索引

你的查询里用到了LOWER(字段) LIKE '%xxx%',普通的字段索引对这种函数处理后的查询不起作用,咱们需要创建函数索引来加速匹配:

  • 针对datas_instance_fiche_perso.valeur_lisible:
CREATE INDEX idx_difp_valeur_lisible_lower ON datas_instance_fiche_perso(LOWER(valeur_lisible));
  • 针对lnk_attributs_objets.valeur:
CREATE INDEX idx_lao_valeur_lower ON lnk_attributs_objets(LOWER(valeur));
  • 针对attributs.nom:
CREATE INDEX idx_attributs_nom_lower ON attributs(LOWER(nom));

另外,别忘了检查所有用于JOIN的外键字段(比如instance_fiche_personnalisee.id_patient、objet.id_patient等)是否有索引——外键通常会自动创建索引,但如果没有的话,一定要补上,JOIN操作的速度会提升很多。

3. 把不必要的LEFT JOIN改成INNER JOIN

你原本用LEFT JOIN是担心人员可能只存在某一个关联表的数据,但实际上你的WHERE条件里的LIKE查询会自动过滤掉那些没有匹配的记录(因为NULL值经过LOWER后还是NULL,不会匹配%gingivite%)。所以LEFT JOIN在这里其实和INNER JOIN效果一样,但INNER JOIN会让数据库少做很多“保留不匹配记录”的无用功,效率更高。

最后小技巧:查看执行计划

如果你想更精准地定位慢的原因,可以用EXPLAIN命令查看查询的执行计划:

EXPLAIN
-- 把你原来的查询或者优化后的查询放在这里

通过执行计划,你能看到哪些表在做全表扫描,哪些索引被用到了,从而针对性地调整优化策略。

内容的提问来源于stack exchange,提问作者LCMa

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.12 05:32:46