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

Percona query fingerprinting - why does order matter in select columns?

假设我有两个查询:

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

既然它们本质上是同一个查询,它们不应该给出相同的指纹吗?我错过了什么吗?

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

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

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

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

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