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

标签 mysql sql fingerprint percona

假设我有两个查询:

SELECT name, description FROM items WHERE id = 5;
SELECT description, name FROM items WHERE id = 5;

当我使用来自 Percona Toolkitpt-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/

相关文章:

android - 取消指纹扫描仪

php - 通过 php 中的函数使用 sql 访问数据库的最智能方法

mysql - COUNT (DISTINCT) 有条件

c# MySqlCommand.Parameters.AddWithValue,参数表达一个表,结果命令添加了单引号

MYSQL Join tables with no unique id on multiple columns

mysql - 如何在 sql 中的 Left Join 中仅显示表的左侧部分(不是相交部分)?

mysql - sql如何实现这个查看表

mysql - 带where子句的insert怎么写?

java - 无法从 Web 服务方法的 try catch block 访问参数

android - 我们可以通过编程方式从我的应用程序添加指纹吗