【问题标题】:How to optimize query with SUBSTR如何使用 SUBSTR 优化查询
【发布时间】:2018-03-08 21:09:59
【问题描述】:
SELECT
    XYZ_ID
FROM XYZ
WHERE
    SUBSTR(Processor_Key, 24, 5) = '01000' AND
    SUBSTR(Processor_Key, 32, 5) = '00900' AND
    SUBSTR(Processor_Key, 40, 5) = '00070' AND
    SUBSTR(Processor_Key, 48, 5) = '10000' AND
    SUBSTR(Processor_Key, 56, 5) = '66000' AND
    SUBSTR(Processor_Key, 64, 5) = '09000' AND
    SUBSTR(Processor_Key, 72, 5) = '00050';

如何优化查询,降低查询成本?

【问题讨论】:

  • 去掉substr。以不需要的方式存储数据。或者处理应用程序代码中的数据处理。否则,您将陷入困境。
  • 数据来自用户,它可以是任何东西..应用程序数据处理不可能,我在这里只添加了虚拟数据。

标签: mysql sql database substring substr


【解决方案1】:

被否决的风险很高,但可能有用的一件事是用单个 LIKE 表达式替换您的许多 SUBSTR 调用:

SELECT XYZ_ID
FROM XYZ
WHERE
    Processor_Key LIKE '_______________________01000___00900___00070___10000___66000___09000___00050%';

这可能优于原始查询的原因是LIKE 表达式可以通过最多单次遍历处理器键的前 77 个字符来计算。在您的原始查询中,您对 SUBSTR 进行了七次不同的调用,每个调用都可能需要进行评估才能做出决定。

话虽如此,正如@Gordon 和上述 cmets 所指出的那样,最好的长期解决方案可能是将您的密钥分解为单独的列并为每一列建立索引。这将使您能够利用数据库的全部功能,例如通过索引。

【讨论】:

    【解决方案2】:

    你不能。 SQL 引擎无法为此查询使用传统索引。

    你有什么选择?根据字符串的实际外观,您也许可以使用全文搜索。

    或者,您可能希望将代码提取到单独的列中,然后在这些列上构建索引。据推测,这些代码实际上意味着什么。您可以在插入时显式执行此操作,或使用触发器来填充列。

    在最新版本的 MySQL 中提供了另一种替代方法,您可以为每个子字符串创建一个生成的列,然后在它们上创建一个索引。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-22
      • 1970-01-01
      • 2022-07-21
      • 2018-10-23
      相关资源
      最近更新 更多