是否有可能找出MySQL / MariaDB中哪些列(未)明确查询?

时间:2017-07-03 10:58:09

标签: mysql mariadb

我们有一个非常大,非常古老的桌子,有几百列。有些列是历史的,不会在任何写作客户端中使用。他们大多是空的(期待非常古老的记录)。我想清理数据库并删除某些表中旧的未使用的列。

问题是所有访问此数据库的第三方客户端(只读)。我不能指望所有提供商更新他们的客户。只要他们查询SELECT * ...,它就不重要了。但我希望他们明确查询(SELECT colA, colB, ...)。显然,从表中删除colA会导致客户端出错。

现在我想知道任何查询语句明确使用哪些列,因此我可以删除未使用的列。我想我可以使用查询日志,分析它并找到明确使用的列,但是:

  1. 我们每小时收到数百万次查询。
  2. 有些客户可能每周访问我们的数据库一次,如果有的话,每隔一秒访问一次。
  3. 这意味着查询日志必须在生产环境中运行数月,而且我不知道这是否会对服务器或整体性能产生负面影响。

    还有其他更稳固的解决方案吗?我对查询日志的疑虑是否夸大了?我希望MariaDB / MySQL在某处存储统计数据,显示列的用法,但我无法找到我需要的任何内容。

2 个答案:

答案 0 :(得分:2)

没有关于查询中提到哪些列的日志。

“常规日志”将每个查询复制到文件中。这可能是一个严重的磁盘占用(空间和速度),尤其是“每小时数百万次查询”。但它会尝试答案......

我认为,一般日志可以通过pt-query-digest汇总。

另一种可能性是将tcpdumppt-query-digest一起使用以获取所有查询。

摘要的优势在于它将多个“类似”查询合并到一个条目中。您仍然需要手动(或有问题地)筛选输出。

大多数列都不值得删除,即使它们从未使用过。我建议关注最庞大的10%。可能有一种方法可以使用tcpdump | egrep来查找这些列名称。细化几次,你可能会发现一些主要候选人被移除。

不幸的是,如果客户端SELECT *,则会使用“所有”列。

答案 1 :(得分:0)

KEY_COLUMN_USAGE 表描述了哪些键列具有约束,您将在结果中获得表名。如果你得到一个空结果,这意味着你可以从表中删除该字段而不用担心FK。

SELECT *
    FROM
      KEY_COLUMN_USAGE
    WHERE
       REFERENCED_COLUMN_NAME = 'your_column_name';