【问题标题】:Table column with duplicated text values具有重复文本值的表格列
【发布时间】:2014-01-21 09:09:34
【问题描述】:

我有一个数据库表,其中有一个 varchar(200) 列。
这是一个包含历史日志信息的表,其中表中大约 99.9% 的行包含与表中另一行相同的文本消息。
该数据库的大小和搜索速度正在成为问题。

所以我想我可以将 varchar 值移动到另一个具有唯一文本值的表中,然后在第一个表中的每一行都引用该表,但在我更改之前,我想知道是否有有更简单的方法吗?
例如,在我现有的表列上设置一些属性会自动导致这种行为。以便数据库自动维护具有唯一文本的表。我意识到这会对删除操作产生很大的性能影响,但无论如何这几乎从未做过。 另外,我真的很想避免更改插入日志表的程序。

我一直在使用 MySQL,但如果另一个数据库可以做到这一点,它也是一个将数据库更改为另一个的选项。 (MariaDB 还是其他?)

谢谢

【问题讨论】:

  • 你想在这里实现什么 - 正常化或提高速度?
  • 另外,如果这只是一个历史日志,你为什么要首先登录 MySQL?
  • 我的第一个目标是减小数据库的大小。我需要在日志中搜索,这就是我使用数据库的原因。数据中还有时间戳和其他列。
  • 您为什么不每天、每周或每月制作单独的表格?因为你现在会缩小尺寸,但是 3 个月呢?还是 6 个?

标签: mysql sql mariadb


【解决方案1】:

没有属性或任何东西可以为您处理此问题,但您有一个好主意,将 varchar 数据放在单独的表中。为此,请按照以下步骤操作。

  1. 像这样创建包含 varchar 数据的表:

    CREATE TABLE log_messages (id int auto_increment primary key, message varchar(200)) ENGINE = MyISAM ROW_FORMAT=FIXED;

  2. 插入你的 varchar 数据

    INSERT INTO log_messages (message) SELECT DISTINCT your_varchar_column FROM your_table;

  3. 在原始表中添加一个新列以引用新的 log_messages 表

    ALTER TABLE your_table ADD COLUMN message_id int not null;

  4. 创建参考

    UPDATE your_table y INNER JOIN log_messages m ON y.your_varchar_column = m.message SET y.message_id = m.id;

  5. 然后您可以从表中删除 varchar 列

    ALTER TABLE your_table DROP COLUMN your_varchar_column;

既然您有了这个,我不确定您为什么担心对删除操作的性能影响。没有。

【讨论】:

    【解决方案2】:

    这是进行规范化的正确方法,但我的建议是数字(整数)而不是唯一文本.....

    【讨论】:

    • 感谢您的回答。如果我必须重新做,我也会这样做。我只是想确保我没有在数据库可以为我处理的事情上浪费时间。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-04-02
    • 1970-01-01
    • 2017-12-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多