【问题标题】:MySQL Query optimize for performanceMySQL 查询优化性能
【发布时间】:2022-07-26 09:53:12
【问题描述】:

您能否帮我优化一下这个查询:

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;

【问题讨论】:

  • 仅给出查询很难调试。我们需要看解释计划,表格描述。如果可能,请以文本格式添加数据示例和预期结果,也许查询可以用另一种更有效的方式编写
  • 您真的需要CONCAT 看似静态的字符串吗?
  • 欢迎来到 Stack Overflow!为了帮助您解决query-optimization 的问题,我们需要查看您的表定义、索引定义和 EXPLAIN 的输出。请read this,然后edit您的问题。而且,您应该知道 LIKE '%something' 带有领先的 % 几乎是不可能优化的。

标签: mysql performance optimization sap-commerce-cloud


【解决方案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(如果用户输入“单词”,而不是随机字符串)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-21
    • 2022-10-13
    • 2022-11-19
    • 2021-12-06
    • 2016-12-01
    • 2020-07-05
    相关资源
    最近更新 更多