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

ibps3vxo  于 2021-06-20  发布在  Mysql
关注(0)|答案(1)|浏览(321)

假设我有两个问题:

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

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

w46czmvw

w46czmvw1#

是的,您是对的,查询的select列表中列的顺序对性能没有影响。
但将这两个查询视为同一个指纹可能会模糊查询的来源。
假设您有这两个查询,每个查询都位于应用程序的不同部分。您可能想知道哪一个负责40%的查询负载,哪一个只负责2%的查询负载。
如果必须像您所描述的那样检测列的可交换性,那么生成查询的指纹也要复杂得多。这也适用于where子句中的布尔术语,在某种程度上也适用于from子句中联接表的顺序,以及联合查询在联合中的顺序。
的代码 fingerprint() 只有大约100行代码用正则表达式实现模式匹配。执行您描述的操作需要一个完整的sql解析器。请参见此处的代码:https://github.com/percona/percona-toolkit/blob/3.0/lib/queryrewriter.pm

相关问题