Percona查询指纹识别 - 为什么订单在选择列中很重要?

问题描述 投票:1回答:1

假设我有两个问题:

SELECT name, description FROM items WHERE id = 5;
SELECT description, name FROM items WHERE id = 5;

当我在这些查询中使用pt-fingerprint中的Percona Toolkit时,它们会给出不同的指纹:

select name, description from items where id = ?;
select description, name from items where id = ?;

由于它们基本上是相同的查询,它们不应该给出相同的指纹吗?我错过了什么吗?

mysql sql fingerprint percona
1个回答
0
投票

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

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

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

如果必须在您描述的情况下检测列的交换性,那么生成查询指纹也会复杂得多。这也适用于WHERE子句中的布尔项,以及FROM子句中连接表的某种程度,以及UNION中的联合查询的顺序。

fingerprint()的代码只有大约100行代码来执行使用正则表达式的模式匹配。做你描述的内容需要一个完整的SQL解析器。请参阅此处的代码:https://github.com/percona/percona-toolkit/blob/3.0/lib/QueryRewriter.pm

© www.soinside.com 2019 - 2024. All rights reserved.