假设我有两个查询:
SELECT name, description FROM items WHERE id = 5;
SELECT description, name FROM items WHERE id = 5;
当我在这些查询中使用Percona Toolkit中的pt-fingerprint
时,它们会给出不同的指纹:
select name, description from items where id = ?;
select description, name from items where id = ?;
由于它们本质上是相同的查询,因此它们不应该给出相同的指纹吗?我想念什么吗?
答案 0 :(得分:0)
是的,是的,查询的选择列表中的列顺序对性能没有影响。
但是将这两个查询视为相同的指纹可能会掩盖查询的来源。
假设您有这两个查询,每个查询都位于应用程序的不同部分。您可能想知道哪个占查询负载的40%,哪个只占查询负载的2%。
如果必须像您描述的那样检测列的可交换性,则生成查询的指纹也将更加复杂。这也将适用于WHERE子句中的布尔术语,并且在某种程度上也适用于FROM子句中的联接表顺序,以及UNION中的联合查询顺序。
fingerprint()
的代码只有大约100行代码可以执行使用正则表达式实现的模式匹配。按照您的描述进行操作将需要成熟的SQL解析器。在此处查看代码:https://github.com/percona/percona-toolkit/blob/3.0/lib/QueryRewriter.pm