假设我有两个问题:
SELECT name, description FROM items WHERE id = 5;
SELECT description, name FROM items WHERE id = 5;
当我使用 pt-fingerprint
在percona工具箱中,这些查询提供了不同的指纹:
select name, description from items where id = ?;
select description, name from items where id = ?;
既然它们本质上是相同的查询,那么它们不应该给出相同的指纹吗?我错过什么了吗?
1条答案
按热度按时间w46czmvw1#
是的,您是对的,查询的select列表中列的顺序对性能没有影响。
但将这两个查询视为同一个指纹可能会模糊查询的来源。
假设您有这两个查询,每个查询都位于应用程序的不同部分。您可能想知道哪一个负责40%的查询负载,哪一个只负责2%的查询负载。
如果必须像您所描述的那样检测列的可交换性,那么生成查询的指纹也要复杂得多。这也适用于where子句中的布尔术语,在某种程度上也适用于from子句中联接表的顺序,以及联合查询在联合中的顺序。
的代码
fingerprint()
只有大约100行代码用正则表达式实现模式匹配。执行您描述的操作需要一个完整的sql解析器。请参见此处的代码:https://github.com/percona/percona-toolkit/blob/3.0/lib/queryrewriter.pm