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';
如何优化查询并降低查询成本?
答案 0 :(得分:3)
被低估的风险很高,但可能有用的一件事就是用一个SUBSTR
表达式替换您的多个LIKE
来电:
SELECT XYZ_ID
FROM XYZ
WHERE
Processor_Key LIKE '_______________________01000___00900___00070___10000___66000___09000___00050%';
这可能优于原始查询的原因是,LIKE
表达式可以通过在处理器密钥的前77个字符中最多进行一次单次传递来进行评估。在原始查询中,您会对SUBSTR
进行七次不同的调用,每次调用都可能需要进行评估才能做出决定。
正如@Gordon和上述评论所指出的那样,最好的长期解决方案可能是将您的密钥分解为单独的列并为每个列编制索引。这可以让您充分利用数据库的全部功能,例如:通过索引。
答案 1 :(得分:1)
你做不到。 SQL引擎无法使用传统索引进行此查询。
你有什么选择?根据字符串的真实情况,您可以使用全文搜索。
或者,您可能希望将代码拉出到单独的列中 - 然后在这些列上构建索引。据推测,这些代码实际上意味着什么。您可以在插入时明确执行此操作,或使用触发器填充列。
最新版本的MySQL中提供了另一种替代方法,您可以为每个子字符串创建一个生成的列,然后在它们上创建一个索引。