我们有一个非常大,非常古老的桌子,有几百列。有些列是历史的,不会在任何写作客户端中使用。他们大多是空的(期待非常古老的记录)。我想清理数据库并删除某些表中旧的未使用的列。
问题是所有访问此数据库的第三方客户端(只读)。我不能指望所有提供商更新他们的客户。只要他们查询SELECT * ...
,它就不重要了。但我希望他们明确查询(SELECT colA, colB, ...
)。显然,从表中删除colA会导致客户端出错。
现在我想知道任何查询语句明确使用哪些列,因此我可以删除未使用的列。我想我可以使用查询日志,分析它并找到明确使用的列,但是:
这意味着查询日志必须在生产环境中运行数月,而且我不知道这是否会对服务器或整体性能产生负面影响。
还有其他更稳固的解决方案吗?我对查询日志的疑虑是否夸大了?我希望MariaDB / MySQL在某处存储统计数据,显示列的用法,但我无法找到我需要的任何内容。
答案 0 :(得分:2)
没有关于查询中提到哪些列的日志。
“常规日志”将每个查询复制到文件中。这可能是一个严重的磁盘占用(空间和速度),尤其是“每小时数百万次查询”。但它会尝试答案......
我认为,一般日志可以通过pt-query-digest
汇总。
另一种可能性是将tcpdump
与pt-query-digest
一起使用以获取所有查询。
摘要的优势在于它将多个“类似”查询合并到一个条目中。您仍然需要手动(或有问题地)筛选输出。
大多数列都不值得删除,即使它们从未使用过。我建议关注最庞大的10%。可能有一种方法可以使用tcpdump | egrep
来查找这些列名称。细化几次,你可能会发现一些主要候选人被移除。
不幸的是,如果客户端SELECT *
,则会使用“所有”列。
答案 1 :(得分:0)
KEY_COLUMN_USAGE 表描述了哪些键列具有约束,您将在结果中获得表名。如果你得到一个空结果,这意味着你可以从表中删除该字段而不用担心FK。
SELECT *
FROM
KEY_COLUMN_USAGE
WHERE
REFERENCED_COLUMN_NAME = 'your_column_name';