请您为我优化这个查询:
SELECT
case when EXISTS (
SELECT
1
FROM
usergroups item_t1
WHERE
(item_t0.p_b2bunits = item_t1.p_uid)
AND (item_t1.TypePkString = 8796095217746)
) THEN true ELSE false END as active,
item_t0.p_b2bunits as code,
item_t0.p_accountname as name1,
item_t0.p_accountnameextension as name2,
case when EXISTS (
SELECT
1
FROM
user2salreprelation item_t2
WHERE
(
item_t2.SourcePK = item_t0.PK
and item_t2.TargetPK = 8828959653892
)
AND (item_t2.TypePkString = 8796150399058)
) THEN true ELSE false END as isFav
FROM
account2salesrep item_t0
WHERE
(
item_t0.p_showondashboard = 1
AND item_t0.p_district = '4'
AND (
LOWER(item_t0.p_accountname) LIKE CONCAT('%', CONCAT('crampel alu', '%'))
OR LOWER(item_t0.p_accountnameextension) LIKE CONCAT('%', CONCAT('crampel alu', '%'))
OR LOWER(item_t0.p_b2bunits) LIKE CONCAT('%', CONCAT('crampel alu', '%'))
)
)
AND (item_t0.TypePkString = 8796149842002)
order by
item_t0.p_accountname
LIMIT
0, 11;发布于 2022-07-26 01:53:12
输入如果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()删除为不必要和缓慢。
和带有主导通配符(%)的一样,不需要索引。您是否考虑过使用全文(如果用户输入"words",而不是随机字符串)。它将涉及
FULLTEXT(p_accountname, p_accountnameextension, p_accountnameextension)
MATCH(p_accountname, p_accountnameextension, p_accountnameextension)
AGAINST('+crampel alu' IN BOOLEAN MODE)crampel alu是列名吗?前缀?还有别的吗?
https://stackoverflow.com/questions/73109130
复制相似问题