Percona查询指纹-为什么选择列中的顺序很重要?

时间:2018-08-03 15:32:12

标签: mysql sql fingerprint percona

假设我有两个查询:

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 = ?;

由于它们本质上是相同的查询,因此它们不应该给出相同的指纹吗?我想念什么吗?

1 个答案:

答案 0 :(得分:0)

是的,是的,查询的选择列表中的列顺序对性能没有影响。

但是将这两个查询视为相同的指纹可能会掩盖查询的来源。

假设您有这两个查询,每个查询都位于应用程序的不同部分。您可能想知道哪个占查询负载的40%,哪个只占查询负载的2%。

如果必须像您描述的那样检测列的可交换性,则生成查询的指纹也将更加复杂。这也将适用于WHERE子句中的布尔术语,并且在某种程度上也适用于FROM子句中的联接表顺序,以及UNION中的联合查询顺序。

fingerprint()的代码只有大约100行代码可以执行使用正则表达式实现的模式匹配。按照您的描述进行操作将需要成熟的SQL解析器。在此处查看代码:https://github.com/percona/percona-toolkit/blob/3.0/lib/QueryRewriter.pm

相关问题