【问题标题】:Percona query fingerprinting - why does order matter in select columns?Percona 查询指纹识别 - 为什么选择列中的顺序很重要?
【发布时间】:2018-08-03 15:32:11
【问题描述】:

假设我有两个查询:

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

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

【问题讨论】:

    标签: mysql sql fingerprint percona


    【解决方案1】:

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

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

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

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

    fingerprint() 的代码只有大约 100 行代码,用于使用正则表达式实现模式匹配。做你描述的事情需要一个成熟的 SQL 解析器。在此处查看代码:https://github.com/percona/percona-toolkit/blob/3.0/lib/QueryRewriter.pm

    【讨论】:

      猜你喜欢
      • 2013-11-18
      • 1970-01-01
      • 1970-01-01
      • 2012-02-06
      • 1970-01-01
      • 1970-01-01
      • 2013-05-18
      • 1970-01-01
      相关资源
      最近更新 更多