คอลัมน์ตารางที่มีค่าข้อความซ้ำกัน

ฉันมีตารางฐานข้อมูลที่มีคอลัมน์ varchar(200)
นี่คือตารางที่มีข้อมูลบันทึกประวัติโดยที่ประมาณ 99.9% ของแถวในตารางมีข้อความเดียวกันกับแถวอื่นในตาราง
ขนาดของฐานข้อมูลและความเร็วในการค้นหากำลังเป็นปัญหา

ดังนั้นฉันจึงคิดว่าฉันสามารถย้ายค่า varchar ไปยังตารางอื่นที่มีค่าข้อความที่ไม่ซ้ำแล้วมีการอ้างอิงไปยังตารางนั้นสำหรับทุกแถวในตารางแรก แต่ก่อนที่จะเปลี่ยนสิ่งนี้ ฉันอยากจะรู้ว่ามีวิธีที่ง่ายกว่านี้หรือไม่ จะต้องทำอย่างไร
เช่น การตั้งค่าคุณสมบัติบางอย่างในคอลัมน์ตารางที่มีอยู่ของฉันซึ่งจะทำให้เกิดพฤติกรรมนี้โดยอัตโนมัติ เพื่อให้ฐานข้อมูลรักษาตารางที่มีข้อความไม่ซ้ำกันโดยอัตโนมัติ ฉันรู้ว่าสาเหตุนี้จะมีผลกระทบต่อประสิทธิภาพอย่างมากต่อการดำเนินการลบ แต่ก็แทบไม่เคยทำเลย นอกจากนี้ฉันอยากจะหลีกเลี่ยงการเปลี่ยนโปรแกรมที่แทรกลงในตารางบันทึกจริงๆ

ฉันใช้ MySQL อยู่แล้ว แต่ถ้าฐานข้อมูลอื่นสามารถทำได้ ก็เป็นตัวเลือกในการเปลี่ยนฐานข้อมูลอื่นด้วย (MariaDB หรืออื่น ๆ ?)

ขอบคุณ


person Kennet    schedule 21.01.2014    source แหล่งที่มา
comment
คุณต้องการบรรลุผลอะไรที่นี่ - การทำให้เป็นมาตรฐานหรือเพิ่มความเร็ว?   -  person divaka    schedule 21.01.2014
comment
นอกจากนี้ หากนี่เป็นเพียงบันทึกประวัติ ทำไมคุณจึงเข้าสู่ระบบ MySQL ตั้งแต่แรก   -  person divaka    schedule 21.01.2014
comment
วัตถุประสงค์แรกของฉันคือการลดขนาดของฐานข้อมูล ฉันต้องค้นหาในบันทึก นั่นเป็นสาเหตุที่ฉันใช้ฐานข้อมูล นอกจากนี้ยังมีการประทับเวลาและคอลัมน์อื่นๆ ในข้อมูลด้วย   -  person Kennet    schedule 21.01.2014
comment
ทำไมคุณไม่แยกตารางเป็นรายวัน รายสัปดาห์ หรือรายเดือนล่ะ? เพราะตอนนี้จะลดขนาดลงแต่3เดือนล่ะ? หรือ 6?   -  person divaka    schedule 21.01.2014


คำตอบ (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;

เมื่อคุณมีสิ่งนั้นแล้ว ฉันไม่แน่ใจว่าทำไมคุณถึงกังวลเกี่ยวกับผลกระทบด้านประสิทธิภาพต่อการดำเนินการลบ ไม่มีเลย

person fancyPants    schedule 21.01.2014

นี่เป็นวิธีที่ถูกต้องในการทำมาตรฐาน แต่คำแนะนำของฉันคือแทนที่จะใช้ข้อความเฉพาะสำหรับ number(integer).....

person Anto Raja Prakash    schedule 21.01.2014
comment
ขอบคุณสำหรับคำตอบ. ถ้าฉันต้องทำมันใหม่ ฉันก็จะทำแบบนั้นเช่นกัน ฉันแค่อยากให้แน่ใจว่าฉันจะไม่เสียเวลาไปกับบางสิ่งที่ฐานข้อมูลสามารถจัดการให้ฉันได้ - person Kennet; 21.01.2014