คีย์ DISABLE ของ MySqlDump ไม่มีผลต่อการนำเข้า


10

ฉันได้ติดตามคำถามก่อนหน้านี้ของฉันเกี่ยวกับความเร็วการนำเข้าด้วย Inno-Tables (ประหลาดใจ!)

สถานการณ์สมมติ
ฉันพยายามนำเข้าฐานข้อมูลขนาดใหญ่ * การถ่ายโอนข้อมูลในเครื่อง dev ท้องถิ่นของฉันในเวลาที่เหมาะสม เรามีจำนวนมากKEYที่แนบมากับตารางซึ่งกลายเป็นคอขวด แต่ยังคงมีความสำคัญสำหรับระบบสดของเรา

แนวทางของฉันหลังจากถามคำถามข้างต้นคือการลบKEY ...คำสั่งจากการถ่ายโอนข้อมูลนำเข้าและเพิ่มคีย์อีกครั้ง

อย่างไรก็ตามฉันมักจะพบว่าตัวเองกำลังแก้ไขการถ่ายโอนข้อมูลปัจจุบันเพื่อนำเข้าภายในเครื่องและฉันเจอ "ความคิดเห็น" ตลกเหล่านี้ (The disable/enable keys-lines)

--
-- Dumping data for table `monster`
--

LOCK TABLES `monster` WRITE;
/*!40000 ALTER TABLE `monster` DISABLE KEYS */;
INSERT  INSERT  INSERT
/*!40000 ALTER TABLE `monster` ENABLE KEYS */;
UNLOCK TABLES;

แต่ในความเป็นจริง "ความคิดเห็น" เหล่านี้เป็นเงื่อนไข MySql-Statement

นั่นคือข่าวสำหรับฉัน แต่ตกลงให้รูปแบบผลลัพธ์mysql --versionทุกอย่างดูดีสำหรับฉัน: mysql Ver 14.14 Distrib 5.5.38, for debian-linux-gnu (x86_64) using readline 6.3

สิ่งที่ฉันถือว่า
ตารางถูกล็อค (ดีมันเป็นเพียงฉันบน mashine dev) จากนั้นคีย์ตามที่กำหนดในตารางคีมาจะถูกปิดใช้งานนำเข้าข้อมูลและเปิดใช้งานคีย์
ดังนั้นระหว่าง "การแทรกข้อมูล" - เฟสไม่ควรเสียเวลากับคีย์ แต่ควรตรวจสอบหลังจากแทรกข้อมูลทั้งหมดแล้ว

ฉันจะคิดว่านี่เป็นพฤติกรรมแบบเดียวกันกับถ้าฉันลบKEY 'foo' (foo)'-line ทั้งหมดออกจากการถ่ายโอนข้อมูลนำเข้าการถ่ายโอนข้อมูลและเรียกใช้สคริปต์ADD KEY 'foo' ...หลังจากนั้น

สิ่งที่ฉันสังเกต
มันเป็นวิธีที่เร็วกว่าในการลบคีย์นำเข้าและเพิ่มคีย์ด้วยตนเองอีกครั้งจากนั้นขึ้นอยู่กับDISABLE KEYSคำสั่งตามเงื่อนไขที่สร้างขึ้นของฉันmysqldump

การแก้ไขการถ่ายโอนข้อมูลด้วยตนเอง + นำเข้า mysql + เพิ่มคีย์ = 15 + 8 + 8 ≈ 30 นาที
การนำเข้า mysql ธรรมดา: เลิกแล้ว (ฉันเพิ่งได้รับเงิน 8 ชั่วโมง / วัน> :))

ฉันอดไม่ได้ที่จะคิดว่าฉันขาดอะไรบางอย่างที่เป็นพื้นฐานที่นี่ (หรือฐานข้อมูลกำลังหลอกหลอนฉัน)


2
ระยะสั้น: ใช้mysqldump --innodb-optimize-keysจาก Percona percona.com/doc/percona-server/5.5/management/…ระยะยาว: หยุดใช้ mysqldump และใช้ mydumper หรือ xtrabackup
jynus

คำตอบ:


12

คุณไม่สามารถเชื่อถือได้DISABLE KEYS;และENABLE KEYS;สำหรับ InnoDB เพราะมันไม่ได้ถูกนำไปใช้ใน InnoDB Storage Engine วิ่งALTER TABLE ... DISABLE KEYS;และALTER TABLE ... ENABLE KEYS;ออกแบบมาสำหรับ MyISAM ตามที่ระบุไว้ในเอกสาร MySQL สำหรับALTER TABLE :

หากคุณใช้ ALTER TABLE บนตาราง MyISAM ดัชนีที่ไม่ซ้ำกันทั้งหมดจะถูกสร้างขึ้นในชุดที่แยกต่างหาก (เช่นสำหรับ REPAIR TABLE) สิ่งนี้จะทำให้ ALTER TABLE เร็วขึ้นเมื่อคุณมีดัชนีจำนวนมาก

สำหรับตาราง MyISAM การอัพเดตคีย์สามารถควบคุมได้อย่างชัดเจน ใช้การเปลี่ยนแปลงตาราง ... ปิดใช้งานคีย์เพื่อบอก MySQL เพื่อหยุดการปรับปรุงดัชนีที่ไม่ซ้ำกัน จากนั้นใช้ตารางแก้ไข ... เปิดใช้งานคีย์เพื่อสร้างดัชนีที่หายไปอีกครั้ง MyISAM ทำสิ่งนี้ด้วยอัลกอริทึมพิเศษที่เร็วกว่าการแทรกคีย์ทีละหนึ่งดังนั้นการปิดใช้งานคีย์ก่อนที่จะทำการดำเนินการแทรกจำนวนมากควรให้การเร่งความเร็วที่รวดเร็ว การใช้ ALTER TABLE ... DISABLE KEYS ต้องการสิทธิ์ INDEX นอกเหนือจากสิทธิ์ที่ระบุไว้ก่อนหน้านี้

ในขณะที่ดัชนี nonunique ถูกปิดใช้งานพวกเขาจะถูกละเว้นสำหรับคำสั่งเช่น SELECT และอธิบายที่มิฉะนั้นจะใช้พวกเขา

ไม่มีการพูดถึง InnoDB ในบริบทที่เคยทำมา ALTER TABLE ... DISABLE/ENABLE KEYS;

แม้ว่าคุณจะเรียกใช้ALTER TABLE ... DISABLE KEYS;กับตาราง InnoDB มันจะสร้างคำเตือน:

mysql> show create table mytimes\G
*************************** 1. row ***************************
       Table: mytimes
Create Table: CREATE TABLE `mytimes` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `totalTime` int(11) NOT NULL,
  `totalTimeDesc` varchar(128) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=latin1
1 row in set (0.00 sec)

mysql> alter table mytimes disable keys;
Query OK, 0 rows affected, 1 warning (0.01 sec)

mysql> show warnings;
+-------+------+-------------------------------------------------------------+
| Level | Code | Message                                                     |
+-------+------+-------------------------------------------------------------+
| Note  | 1031 | Table storage engine for 'mytimes' doesn't have this option |
+-------+------+-------------------------------------------------------------+
1 row in set (0.00 sec)

mysql>

นั่นเป็นสาเหตุที่ไม่มีผลกระทบ โปรดจำได้ว่า@jynus กล่าวถึงสิ่งเดียวกันในคำตอบของเขาใน bulletpoint 7

โปรดทราบว่า MyISAM เก็บข้อมูลและดัชนีในไฟล์แยกสองไฟล์ (.MYD สำหรับข้อมูล, .MYI สำหรับดัชนี) ดังนั้นจึงเป็นเรื่องไม่สำคัญที่จะปิดการใช้งานและเปิดใช้งานดัชนี InnoDB เก็บคีย์หลักและข้อมูลแถวไว้ในหน้า InnoDB เดียวกัน (ผ่านดัชนีแบบกลุ่ม) ดัชนีรองจะดำเนินการคีย์หลักเป็นสิ่งที่แนบไปยังรายการใบดัชนีทุกรอง เนื่องจากข้อมูลและดัชนีถูกรวมเข้าด้วยกันผ่านดัชนีแบบกลุ่มจึงยังไม่มีใครพยายามดำเนินการDISABLE KEYSและENABLE KEYSใน InnoDB


1
"ฉันบอกคุณแล้ว" :-)
jynus

@jynus HA HA :-) คุณควรโพสต์ความคิดเห็น mysqldump ของคุณสำหรับ InnoDB ( dba.stackexchange.com/questions/76565/ … ) เป็นคำตอบ
RolandoMySQLDBA

@yoshi ฉันกำลังเขียนบทความตามคำถามเดิมของคุณคอยติดตาม
jynus

@yosi ตามที่สัญญา: dbahire.com/…
jynus

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