การเพิ่มดัชนีไปยังตาราง mysql ขนาดใหญ่


13

ฉันมีโต๊ะ

| base_schedule_line_items | สร้างตารางbase_schedule_line_items(
idint (10) unsigned NOT NULL AUTO_INCREMENT,
installmentint (10) unsigned NOT NULL,
on_dateวันที่ NOT NULL,
actual_dateวันที่ DEFAULT NULL,
payment_typeint (11) NOT NULL,
scheduled_principal_outstandingทศนิยม (65,0) NOT NULL,
scheduled_principal_dueทศนิยม (65,0) ไม่เป็น NULL,
scheduled_interest_outstandingทศนิยม (65,0) ไม่เป็น NULL,
scheduled_interest_dueทศนิยม (65,0) ไม่เป็น NULL,
currencyint (11) ไม่เป็น NULL, วันที่และเวลา
updated_atไม่เป็นค่าเริ่มต้น '2013-01-06 14:29:16',
created_atdatetime ไม่เป็นค่าเริ่มต้น ' 2013-01-06 14:29:16 ',
loan_base_schedule_idint (10) ไม่ได้ลงนามไม่เป็นโมฆะ,
lending_idint (10) ไม่ได้ลงนามไม่เป็นโมฆะ,
rescheduleจิ๋ว (1) เริ่มต้น' 0 ',
คีย์หลัก ( id),
คีย์หลักindex_base_schedule_line_items_loan_base_schedule ( loan_base_schedule_id), KEY index_bslt_spd( scheduled_principal_due),
KEY index_bslt_lending(lending_id),
คีย์index_bslt_actualdate( actual_date),
คีย์index_bslt_spsila ( loan_base_schedule_id, scheduled_principal_due, scheduled_interest_due, actual_date),
คีย์index_bslt_ondate( on_date),
คีย์index_bslt_oa( on_date, actual_date),
คีย์index_bslt_ol( on_date, loan_base_schedule_id),
คีย์index_bslt_oli( on_date, lending_id)
) ENGINE = InnoDB AUTO_INCREMENT = 30410126 เริ่มต้น charset = utf8 |

ตอนนี้ตารางนี้มีบันทึกอยู่ 30 ล้านรายการฉันต้องเพิ่มดัชนีอีกสองรายการลงในตารางนี้และเหมือนกับที่ใช้เวลาเพิ่มหลายปี

แก้ไขตาราง base_schedule_line_items เพิ่มดัชนี index_bslt_sla (sched_principal_due, real_date, ยืม_id);
แก้ไขตาราง base_schedule_line_items เพิ่มดัชนี index_bslt_ssla (sched_principal_due, sched_interest_due, ยืม_id, actual_date);

ฉันใช้แบบสอบถามที่กล่าวถึงด้านล่างเพื่อหาขนาดของตาราง

SELECT table_name เป็น "Tables", round (((data_length + index_length) / 1024/1024), 2) "Size เป็น MB" จาก information_schema.TABLES ที่ table_schema = "my_database_name";

ผลออกมาเป็น

base_schedule_line_items | 20,111.00

ฉันใช้สิ่งนี้เพื่อคำนวณความยาวข้อมูลและทิ้งความยาวดัชนี

SELECT table_name เป็น "Tables", round (((data_length) / 1024/1024), 2) "Size เป็น MB" จาก data_schema.TABLES ที่ table_schema = "my_database_name";

และผลลัพธ์ก็คือ

base_schedule_line_items | 9,497.00

ดัชนี

index_bslt_actualdate KEY (actual_date)
index_bslt_spsila KEY (loan_base_schedule_id, scheduled_principal_due, scheduled_interest_due, actual_date)
KEY index_bslt_ondate (on_date)
KEY index_bslt_oa (on_date, actual_date)
KEY index_bslt_ol (on_date, loan_base_schedule_id)
KEY index_bslt_oli (on_date, lending_id)

ถูกเพิ่มเข้ามาโดยฉัน แต่ฉันไม่ได้เป็น fsure หรือมีการเพิ่มดัชนีอื่น ๆ เพื่อวัตถุประสงค์ใด นี่เป็นแอปพลิเคชั่นที่ใหญ่พอสมควร ตอนนี้ฉันต้องเพิ่มดัชนีทั้งสองที่กล่าวถึงข้างต้นเนื่องจากพวกเขาช่วยฉันในการแยกรายงานโดยใช้คำสั่ง select และฉันพบว่ามันยากมากที่จะเพิ่มพวกเขา ความช่วยเหลือใด ๆ ที่จะได้รับการชื่นชมอย่างมาก

คำตอบ:


16

กิจกรรมการแก้ไขตารางขนาดใหญ่จะดำเนินการในเฟส:

  1. สร้างตารางใหม่ที่มีฟิลด์และดัชนีที่ต้องการพูดในการทดสอบ DB (โครงสร้างเพียง)
  2. ดัมพ์ข้อมูลจากตารางที่มีอยู่และโหลดไปยังตารางที่สร้างขึ้นใหม่ในการทดสอบฐานข้อมูล
  3. ตอนนี้ประกาศการหยุดทำงานของคุณ :)
  4. สลับตารางโดยการเปลี่ยนชื่อ - RENAME table ur_db.table_name to test.temp, test.table_name to ur_db.table_name, test.temp to test.table_name;นี่คือการดำเนินการปรมาณูสละเวลาเสี้ยววินาที
  5. โหลดเรคคอร์ดพิเศษลงในตารางที่สร้างขึ้นใหม่ (เร็กคอร์ดที่มาหลังจากการดัมพ์แล้วโหลด) ขั้นตอนนี้สามารถทำได้ก่อนขั้นตอนที่ 3 อีกครั้งเพื่อลดเวลาหยุดทำงาน
  6. และระบบของคุณกลับมาแล้ว

หมายเหตุเล็กน้อย:

  1. คุณไม่ต้องกดคีมาข้อมูลโดยตรงเช่นนี้ลองใช้ SHOW TABLE STATUS from db like 'table_name'
  2. ความเร็วของตารางแก้ไขจะเชื่อมโยงกับความเร็ว I / O มากขึ้นหรือน้อยลง ครั้งสุดท้ายที่เรารันตารางแก้ไขโดยตรง (โดยไม่มีขั้นตอนข้างต้น) เรามีขนาด 40GB + ขนาดตารางใช้เวลาประมาณ 4 ชั่วโมง หากข้อมูล 20GB ของคุณใช้เวลาเป็นปีคุณกำลังทำงานกับเครื่องที่ล้าสมัย
  3. นอกจากนี้การลดลงของดัชนีที่ไม่พึงประสงค์เช่นเดียวindex_bslt_ondate, index_base_schedule_line_items_loan_base_scheduleกับดัชนีอื่น ๆ มีคอลัมน์ด้านซ้ายมากที่สุดเป็นคอลัมน์ดัชนี

โปรดแจ้งให้เราทราบหากคุณต้องการคำชี้แจงใด ๆ ในขั้นตอนเหล่านี้

แก้ไข: สคริปต์ python ง่าย ๆ เพื่อทำให้กระบวนการทำงานอัตโนมัติhttps://github.com/georgecj11/hotswap_mysql_table.git


10

คุณสามารถใช้เครื่องมือเช่นpt-online-schema-changeเพื่อเพิ่มดัชนีโดยไม่ต้องปิดกั้นแอปพลิเคชันของคุณ ตรรกะพื้นฐานมีดังนี้:

  • สร้างสำเนาว่างของตารางด้วยดัชนีใหม่
  • เพิ่มทริกเกอร์ไปยังตารางที่มีอยู่เพื่อให้การเปลี่ยนแปลงใด ๆ ที่กระทบกับตารางถูกนำไปใช้กับสำเนาของตาราง *
  • เริ่มคัดลอกแถวจากตารางเก่าไปยังใหม่
  • เมื่อการคัดลอกเสร็จสิ้นให้สลับตารางออก
  • วางโต๊ะเก่า

* เครื่องมือไม่ทำงานหากมีทริกเกอร์ที่มีอยู่ในตาราง

พฤติกรรมการสลับและวางสามารถปรับได้ตามตัวเลือกที่ส่งไปยังเครื่องมือ

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

และแน่นอนว่าควรตรวจสอบให้แน่ใจว่าคุณมีข้อมูลสำรองของตารางเพื่อให้สามารถกู้คืนได้หากจำเป็น

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.