繁体   English   中英

具有重复文本值的表列

[英]Table column with duplicated text values

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

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

我一直在使用MySQL,但如果另一个数据库可以这样做,它也可以选择另一个更改数据库。 (MariaDB或其他?)

谢谢

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM