具有重复文本值的表列

时间:2014-01-21 09:09:34

标签: mysql sql mariadb

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

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

我一直在使用MySQL,但如果另一个数据库可以执行此操作,则还可以选择另一个数据库。 (MariaDB或其他?)

由于

2 个答案:

答案 0 :(得分:2)

没有任何属性或任何可以为您处理此问题,但您在那里有一个好主意,将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;

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

答案 1 :(得分:1)

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