假设我有两个查询:
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 = ?;
既然它们本质上是相同的查询,它们不应该给出相同的指纹吗?我错过了什么吗?
最佳答案
是的,您是对的,查询选择列表中列的顺序对性能没有影响。
但是将这两个查询视为相同的指纹可能会掩盖查询的来源。
假设您有这两个查询,每个查询都在您应用程序的不同部分。您可能想知道哪个负责 40% 的查询负载,哪个只负责 2% 的查询负载。
如果它必须像您描述的那样检测列的交换性,那么生成查询的指纹也会复杂得多。这也适用于 WHERE 子句中的 bool 项,并且在某种程度上适用于 FROM 子句中连接表的顺序,以及 UNION 中联合查询的顺序。
fingerprint()
的代码只有大约 100 行代码,用于执行使用正则表达式实现的模式匹配。执行您描述的操作需要一个成熟的 SQL 解析器。请参阅此处的代码:https://github.com/percona/percona-toolkit/blob/3.0/lib/QueryRewriter.pm
关于mysql - Percona 查询指纹 - 为什么选择列中的顺序很重要?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51675926/