ตาราง MySQL Merge - ปริมาณการใช้ข้อมูลสูงและข้อมูลจำนวนมาก

ปัจจุบันงานของฉันใช้ MySQL (MyISAM) สำหรับการจัดเก็บข้อมูลทั้งหมดโดยเฉพาะ ขณะนี้เรามีเว็บเซิร์ฟเวอร์มากกว่า 300 แห่งและฐานข้อมูลประมาณ 150 แห่ง น่าเสียดายที่ฉันอยู่ในฐานะที่ต้องเขียนโครงสร้างตารางเพื่อรองรับแถวมากกว่า 100 ล้านแถวในระยะเวลา 30 วัน แนวคิดคือ:

  1. ส่วนแทรกที่มีปริมาณมาก (ไม่มีการอัพเดตหรือการลบและจะอยู่ท้ายตารางเสมอ)
  2. เลือก 1 แถว
  3. ข้อมูลที่เก่ากว่า 30 วันจะถูกละทิ้ง

ทางออกที่ดีที่สุดน่าจะเป็นการรวมตารางในแต่ละวันเข้ากับตารางผสานสำหรับการเลือก จะมีข้อมูลที่ซ้ำกันแน่นอน แต่ SELECT จะดึงเฉพาะแถวล่าสุดตามการประทับเวลาและฟิลด์ int เท่านั้น แน่นอนว่าการมีโต๊ะ 30 โต๊ะนั้นไม่เหมาะนัก แต่ชีวิตก็ดำเนินไปเช่นกัน

มีข้อบกพร่องโดยธรรมชาติในแนวทางนี้หรือไม่? มีวิธีอื่นใดในการเข้าถึงสิ่งนี้ที่ฉันขาดหายไป (เราติดอยู่ที่ 5.0) การล็อกตารางจะเป็นปัญหาใหญ่หรือไม่เมื่อดำเนินการ ALTER TABLE บนตารางผสานเมื่อมีการสร้างตารางของวันใหม่ ขณะนี้เรามีโครงสร้างการหมุนเวียนตารางอยู่แล้ว แต่ถ้าเราเลือกตารางเดียวโดยต้องเลือกข้อมูลที่เราต้องการจากตารางเก่าไปเป็นตารางใหม่คงจะค่อนข้างช้าเนื่องจากมีเข้าใกล้ 100 ล้านแถว

มีเทคโนโลยีอื่นๆ ที่ช่วยให้บรรลุเป้าหมายนี้ได้อย่างสง่างาม แต่ทีมขายของเราขายโซลูชันไปแล้ว และเราไม่มีเวลามากพอ

ข้อมูลใด ๆ ที่จะได้รับการชื่นชม

โครงสร้าง:

CREATE TABLE `merge_test_1` (
   `date_stamp` long NOT NULL,
   `hash` char(32) NOT NULL,
   `p_id` mediumint(8) unsigned NOT NULL,
   `a_id` mediumint(8) unsigned NOT NULL,
   `b_id` mediumint(8) unsigned NOT NULL,
   PRIMARY KEY  (`hash`,`p_id`,`date_stamp`)
 ) ENGINE=MyISAM

ตัวอย่างแบบสอบถาม

SELECT b_id,a_id FROM merge_test WHERE hash='1' AND p_id=1
ORDER BY date_stamp DESC LIMIT 1

person methodin    schedule 27.09.2010    source แหล่งที่มา


คำตอบ (2)


หากฉันได้รับแก่นแท้ของคำถามนี้ว่าการจัดทำดัชนีจะไม่เกิดผลเนื่องจากมีการแทรกในปริมาณมาก และการค้นหาตาม MAX(id) ไม่ตรงตามเกณฑ์ของคุณ... "SELECT จะดึงเท่านั้น แถวล่าสุดตามการประทับเวลาและฟิลด์ int"

คุณได้ทดสอบโดยใช้มุมมองเพื่อจุดประสงค์นี้หรือไม่? ดูเหมือนเป็นไปได้สำหรับชัยชนะ

E.g.

CREATE TABLE lotsofdata (
id INT UNSIGNED AUTO_INCREMENT,
int_val INT UNSIGNED,
the_timestamp TIMESTAMP,
PRIMARY KEY(id));
--
CREATE VIEW FROM 
SELECT id,int_val,the_timestamp 
FROM lotsofdata
WHERE the_timestamp = MAX(the_timestamp)
AND MAX(int_val)
LIMIT 0,1;

ฉันหวังว่านี่จะช่วยได้. หากคุณสามารถระบุโครงสร้างตารางและตัวอย่างแบบสอบถามได้ ฉันอยากจะช่วย ฉันแค่ต้องการข้อมูลเฉพาะเพิ่มเติม

person randomx    schedule 27.09.2010
comment
ฉันควรจะระบุว่ากลุ่ม DBA ของเราจำกัดสิ่งที่เราสามารถทำได้อย่างเข้มงวดและไม่รองรับ Views แก้ไขโพสต์พร้อมโครงสร้างตัวอย่างและแบบสอบถาม - person methodin; 28.09.2010

ฉันรู้ว่าคุณได้ยอมรับคำตอบของ Views แล้ว และฉันรู้ว่าคุณบอกว่าคุณยังคงติดอยู่ที่ 5.0 ... แต่ฉันก็ยังคิดว่ามันคุ้มค่าที่จะพูดถึงการแบ่งพาร์ติชัน ซึ่งจากสิ่งที่ฉันรวบรวมมา จะช่วยแก้ปัญหาทั้งหมดของคุณได้
การทิ้ง off old data นั้นง่ายเหมือนกับการวางตารางแยกกัน... และเร็วกว่าการ "delete from huge_table โดยที่ timestamp ‹ x"
และหากคุณแน่ใจว่าคิวรีของคุณตัดพาร์ติชั่นอย่างเหมาะสม การอ่านควรจะรวดเร็ว ด้วย.

อันที่จริง ฉันอัปเกรดเป็น 5.1 เพราะฉันมีสถานการณ์ที่คล้ายกันมากและรู้สึกว่าการแบ่งพาร์ติชันเป็นทางออกเดียวที่แท้จริง

person Strahd_za    schedule 05.11.2010