我有一个数据库表,其中有一个varchar(200)列
这是一个包含历史日志信息的表,其中表中大约99.9%的行包含与表中另一行相同的文本消息。
搜索时数据库的大小和速度正在成为一个问题。
所以我想我可以将varchar值移动到另一个具有唯一文本值的表,然后在第一个表中为每一行引用该表,但在我更改之前,我想知道是否存在这是一种更简单的方法吗? 例如,在我现有的表列上设置一些会自动导致此行为的属性。这样数据库就会自动维护一个包含唯一文本的表。我意识到这可能会对删除操作产生很大的性能影响,但这几乎从未进行过。 另外,我真的想避免更改插入日志表的程序。
我一直在使用MySQL,但如果另一个数据库可以执行此操作,则还可以选择另一个数据库。 (MariaDB或其他?)
由于
答案 0 :(得分:2)
没有任何属性或任何可以为您处理此问题,但您在那里有一个好主意,将varchar数据放在一个单独的表中。为此,请按照以下步骤操作。
创建包含varchar数据的表格,如下所示:
CREATE TABLE log_messages (id int auto_increment primary key, message varchar(200)) ENGINE = MyISAM ROW_FORMAT=FIXED;
插入varchar数据
INSERT INTO log_messages (message)
SELECT DISTINCT your_varchar_column
FROM your_table;
在原始表中添加新列以引用新的log_messages表
ALTER TABLE your_table ADD COLUMN message_id int not null;
创建参考
UPDATE your_table y INNER JOIN log_messages m ON y.your_varchar_column = m.message
SET y.message_id = m.id;
然后您可以从表中删除varchar列
ALTER TABLE your_table DROP COLUMN your_varchar_column;
既然你有这个,我不确定你为什么担心性能对删除操作的影响。没有。
答案 1 :(得分:1)
这是进行规范化的正确方法,但我的建议是用数字(整数)代替唯一文本......