Kolom tabel dengan nilai teks duplikat

Saya memiliki tabel database yang memiliki kolom varchar(200).
Ini adalah tabel dengan informasi log historis yang mana sekitar 99,9% baris dalam tabel berisi pesan teks yang sama dengan baris lain dalam tabel.
Ukuran database dan kecepatan pencarian menjadi masalah.

Jadi saya berpikir bahwa saya bisa memindahkan nilai varchar ke tabel lain dengan nilai teks unik dan kemudian memiliki referensi ke tabel itu untuk setiap baris di tabel pertama, tetapi sebelum saya mengubahnya, saya ingin tahu apakah ada yang lebih mudah cara melakukan ini?
Misalnya mengatur beberapa properti di kolom tabel saya yang ada yang akan menyebabkan perilaku ini secara otomatis. Sehingga database secara otomatis memelihara tabel dengan teks unik. Saya menyadari bahwa hal ini akan berdampak besar pada kinerja pada operasi penghapusan tetapi hal itu hampir tidak pernah dilakukan. Saya juga sangat ingin menghindari perubahan program yang dimasukkan ke dalam tabel log.

Saya telah menggunakan MySQL tetapi jika DB lain dapat melakukan ini, ada juga opsi untuk mengubah database yang lain. (MariaDB atau lainnya?)

Terima kasih


person Kennet    schedule 21.01.2014    source sumber
comment
Apa yang ingin Anda capai di sini - normalisasi atau peningkatan kecepatan?   -  person divaka    schedule 21.01.2014
comment
Juga jika ini hanya log historis, mengapa Anda masuk ke MySQL?   -  person divaka    schedule 21.01.2014
comment
Tujuan pertama saya adalah mengurangi ukuran database. Saya perlu mencari di log itu sebabnya saya menggunakan database. Ada juga stempel waktu dan kolom lain dalam data.   -  person Kennet    schedule 21.01.2014
comment
Mengapa Anda tidak membuat tabel terpisah saja setiap hari, mingguan, atau bulanan? Karena ukurannya akan diperkecil sekarang, tapi bagaimana dengan 3 bulan? Atau 6?   -  person divaka    schedule 21.01.2014


Jawaban (2)


Tidak ada properti atau apa pun yang menangani ini untuk Anda, tetapi Anda punya ide bagus di sana, meletakkan data varchar di tabel terpisah. Untuk melakukannya, ikuti langkah-langkah berikut.

  1. Buat tabel Anda yang menyimpan data varchar Anda seperti ini:

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

  2. Masukkan data varchar Anda

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

  3. Tambahkan kolom baru di tabel asli Anda untuk mereferensikan tabel log_messages baru

    ALTER TABLE your_table ADD COLUMN message_id int not null;

  4. Buat referensi

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

  5. Kemudian Anda dapat menghapus kolom varchar dari tabel Anda

    ALTER TABLE your_table DROP COLUMN your_varchar_column;

Sekarang setelah Anda memilikinya, saya tidak yakin mengapa Anda mengkhawatirkan dampak kinerja pada operasi penghapusan. Tidak ada satupun.

person fancyPants    schedule 21.01.2014

Ini adalah cara yang tepat untuk melakukan normalisasi, tetapi saran saya adalah daripada menggunakan teks unik, gunakan angka (integer)...

person Anto Raja Prakash    schedule 21.01.2014
comment
Terima kasih atas jawabannya. Jika saya harus melakukannya lagi, saya juga akan melakukannya seperti itu. Saya hanya ingin memastikan saya tidak membuang waktu untuk sesuatu yang dapat ditangani oleh database untuk saya. - person Kennet; 21.01.2014