2014-01-21 44 views
4

我有一個數據庫表,其中有一個varchar(200)列。
這是一個包含歷史日誌信息的表,其中表中約99.9%的行與表中的另一行包含相同的文本消息。
搜索時該數據庫的大小和速度成爲問題。帶有重複文本值的表列

所以我想我可以將varchar值移動到具有唯一文本值的另一個表,然後在第一個表中的每一行都有該表的引用,但在更改此之前,我想知道是否有一個更簡單的方法來做到這一點?
例如,在我現有的表列上設置一些會自動導致此行爲的屬性。以便數據庫自動維護一個包含唯一文本的表格。我意識到這會對刪除操作產生巨大的性能影響,但幾乎從來沒有這樣做過。 另外,我真的很想避免更改插入到日誌表中的程序。

我一直在使用MySQL,但如果另一個數據庫可以做到這一點,它也是一個選項來更改另一個數據庫。 (MariaDB的還是其他?)

感謝

+0

你想在這裏實現什麼 - 正常化或提高速度? – divaka

+0

另外,如果這只是一個歷史日誌,爲什麼你在第一時間登錄MySQL? – divaka

+0

我的第一個目標是減少數據庫的大小。我需要在日誌中搜索爲什麼我使用數據庫。數據中還有時間戳和其他colmuns。 – Kennet

回答

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. 然後你可以從表中

    ALTER TABLE your_table DROP COLUMN your_varchar_column;

下降varchar列現在,您個人有T帽子,我不確定你爲什麼關心刪除操作對性能的影響。沒有。

1

這是做歸一化的正確方法,但我的建議是不是唯一的文字去數(整數).....

+0

感謝您的回答。如果我必須完成,我也會這樣做。我只是想確保我不會浪費時間在數據庫可以爲我處理的事情上。 – Kennet