2017-09-27 208 views
0
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优化查询

+4

摆脱substr。以不需要的方式存储数据。或者处理应用程序代码中的数据处理。否则,你几乎卡住了。 – Strawberry

+0

数据来自用户,它可以是任何东西..应用程序数据处理不可能,我只在这里添加了虚拟数据。 – user8413514

回答

3

被downvoted高风险,但有一点可能的工作将是与单个LIKE表达式替换你的许多SUBSTR电话:

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

这可能跑赢大原因,你的原始查询的是,LIKE表达可以通过在处理器密钥的前77个字符中最多进行一次单独通过来进行评估。在您的原始查询中,您会对SUBSTR进行七个不同的调用,每个调用都需要进行评估才能做出决定。

这就是说,正如@戈登和上述评论指出的那样,最好的长期解决方案可能是将您的密钥分解为单独的列并为每一列编制索引。这可以让您充分利用数据库的全部功能,例如通过索引。

1

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

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

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

另一种选择是在最新版本的MySQL中可用,您可以为每个子字符串创建一个生成的列,然后为它们创建一个索引。