我有一组通过各种Java / MySQL代码生成的复杂查询。当我最终执行这些查询时,其中一些查询速度很慢,因为它们链接了不必要的表。
假设我给那些仅使用一个固定行的表之一赋予了别名。我可以做
SELECT a.* FROM TableA a WHERE a.ID=1234
,然后将主查询中的所有引用(例如a.xxxx,a.yyy等)替换为其值。
显然,这些字段可能以各种形式出现,例如后面跟着算术运算符,空格,方括号等。在Java中,最简单的方法是获取所有这些不同对象的列表,然后我就可以替换所有出现的对象?
请注意,尽管这些内容已编入索引,但我仍可以将它们的引用替换为实际值,从而简化一些逻辑,例如有各种各样的嵌套比较,例如IF(a.xxxx> 12,....,...),如果以IF(13> 12,....)表示,MySQL应该能够更好地优化
基于最初的评论,由于我自己生成查询代码,因此我不太担心它是一个完美的解析器,因此可能会解决一些晦涩的场景,使其无法正常工作。
忘记所有解析问题,如何浏览某些文本(使用正则表达式或任何其他方式),找到以“ a。”开头但不以“ ba。”开头的任何片段,即前一个字符不能为字母或一个数字并记录以下所有单词。
示例“长”查询
SELECT ba.g FROM TableA a,TableB ba
WHERE a.field1+ba.g+a.zzz<10 AND a.zzz IS NOT NULL AND a.ID=1234
我要从中提取
field1
zzz
这样我就可以跑步
SELECT a.field1,a.zzz FROM TableA a WHERE a.ID=1234
获取这些值(在本示例中为17和2)并将我的查询更改为
SELECT ba.g FROM TableB ba WHERE 17+ba.g+2<10 AND 2 IS NOT NULL