【解决方案1】:

如果TypePkString 是一个VARCHAR,那么你必须引用8796150399058,否则性能会很差。 (相反的情况无所谓。)

布尔表达式(例如EXISTS(...))返回0 为false 和1 为true,所以这个

CASE WHEN (...) THEN true ELSE false AS ...

可以简化

(...) AS ...

其中一些索引可能会有所帮助:

item_t0:  INDEX(p_showondashboard, p_district, TypePkString, p_accountname)
item_t1:  INDEX(p_uid, TypePkString)
item_t2:  INDEX(SourcePK, TargetPK, TypePkString)

假设p_accountname 有一个以_ci 结尾的排序规则[请提供SHOW CREATE TABLE],您可以删除LOWER(),因为它没有必要且速度慢。

LIKE 带有前导通配符 (%) 会拒绝索引。您是否考虑过使用 FULLTEXT(如果用户输入“单词”,而不是随机字符串)。

【讨论】: