Các phím DISABLE của MySqlDump không ảnh hưởng đến việc nhập


10

Tôi có một câu hỏi tiếp theo về câu hỏi trước đây của tôi về tốc độ nhập với Inno-Bàn (thật bất ngờ!).

Kịch bản
Tôi cố gắng nhập một số kết xuất cơ sở dữ liệu lớn * trên máy dev cục bộ của mình trong thời gian hợp lý. Chúng tôi có rất nhiều KEYs gắn liền với các bảng mà hóa ra là một nút cổ chai nhưng vẫn quan trọng đối với hệ thống trực tiếp của chúng tôi.

Cách tiếp cận của tôi sau khi đặt câu hỏi ở trên là xóa các KEY ...câu lệnh từ kết xuất, nhập và thêm lại các khóa.

Tuy nhiên, tôi thường thấy mình đang chỉnh sửa một bãi chứa hiện tại để nhập nó cục bộ và tôi tình cờ thấy những "bình luận" hài hước này (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;

Nhưng trên thực tế, các "bình luận" này là các Báo cáo MySql có điều kiện

Đó là tin tức đối với tôi nhưng ok, với hình thức đầu ra, mysql --versionmọi thứ đều ổn với tôi: mysql Ver 14.14 Distrib 5.5.38, for debian-linux-gnu (x86_64) using readline 6.3

Những gì tôi giả sử
Bảng đã bị khóa (tốt thôi, đó chỉ là tôi trên dev mashine). Sau đó, các khóa như được xác định trong lược đồ bảng bị vô hiệu hóa, dữ liệu được nhập, các khóa được bật.
Vì vậy, trong quá trình "chèn dữ liệu" -phase, không nên lãng phí thời gian cho các khóa mà phải kiểm tra sau khi tất cả dữ liệu được chèn.

Tôi sẽ nghĩ rằng đây là hành vi tương tự như khi tôi xóa tất cả các KEY 'foo' (foo)'dòng khỏi kết xuất, nhập kết xuất và chạy một tập lệnh ADD KEY 'foo' ...sau đó.

Những gì tôi quan sát
Đó là cách nhanh hơn để xóa các khóa thủ công, nhập và thêm lại các khóa sau đó dựa vào các DISABLE KEYScâu lệnh có điều kiện đã tạo ramysqldump

Chỉnh sửa thủ công kết xuất + nhập mysql + thêm khóa = 15 + 8 + 8 ≈ 30 phút
Nhập mys mys đơn giản: đã bỏ cuộc, (Tôi chỉ được trả tiền trong 8 giờ / ngày> :))

Tôi không thể không nghĩ rằng tôi đang thiếu một cái gì đó rất cơ bản ở đây (hoặc cơ sở dữ liệu đang troll tôi).


2
Ngắn hạn: sử dụng mysqldump --innodb-optimize-keystừ Percona percona.com/doc/percona-server/5.5/man Quản lý / Từ lâu dài: ngừng sử dụng mysqldump và sử dụng mydumper hoặc xtrabackup.
15:30

Câu trả lời:


12

Bạn không thể dựa vào DISABLE KEYS;ENABLE KEYS;cho InnoDB vì nó không được triển khai trong Công cụ lưu trữ InnoDB. Chạy ALTER TABLE ... DISABLE KEYS;ALTER TABLE ... ENABLE KEYS;được thiết kế cho MyISAM. Như đã nói trong Tài liệu MySQL choALTER TABLE :

Nếu bạn sử dụng ALTER TABLE trên bảng MyISAM, tất cả các chỉ mục nonunique sẽ được tạo trong một lô riêng (như đối với BẢNG SỬA CHỮA). Điều này sẽ làm cho ALTER TABLE nhanh hơn nhiều khi bạn có nhiều chỉ mục.

Đối với các bảng MyISAM, cập nhật khóa có thể được kiểm soát rõ ràng. Sử dụng ALTER TABLE ... TỪ KHÓA CÓ THỂ để thông báo cho MySQL ngừng cập nhật các chỉ mục nonunique. Sau đó, sử dụng ALTER TABLE ... ENABLE KEY để tạo lại các chỉ mục bị thiếu. MyISAM thực hiện điều này với một thuật toán đặc biệt nhanh hơn nhiều so với việc chèn từng phím một, do đó, việc vô hiệu hóa các khóa trước khi thực hiện các thao tác chèn số lượng lớn sẽ giúp tăng tốc đáng kể. Sử dụng ALTER TABLE ... TỪ KHÓA CÓ THỂ yêu cầu đặc quyền INDEX ngoài các đặc quyền được đề cập trước đó.

Mặc dù các chỉ mục nonunique bị vô hiệu hóa, chúng bị bỏ qua cho các câu lệnh như CHỌN và GIẢI THÍCH nếu không sẽ sử dụng chúng.

Không có đề cập nào được tạo ra từ InnoDB trong bối cảnh với ALTER TABLE ... DISABLE/ENABLE KEYS;

Ngay cả khi bạn chạy ALTER TABLE ... DISABLE KEYS;với bảng InnoDB, nó sẽ tạo ra một cảnh báo:

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>

Đó là lý do tại sao không có ảnh hưởng. Vui lòng nhớ lại rằng @jynus đã đề cập đến điều tương tự trong câu trả lời của anh ấy trong gạch đầu dòng 7 .

Cũng nên nhớ rằng MyISAM giữ dữ liệu và chỉ mục trong hai tệp riêng biệt (.MYD cho dữ liệu, .MYI cho chỉ mục), do đó, việc vô hiệu hóa và bật chỉ mục sẽ là chuyện nhỏ. InnoDB giữ phím CHÍNH và dữ liệu hàng trong cùng một trang InnoDB (thông qua Chỉ mục cụm). Các chỉ mục phụ sẽ mang theo KHÓA CHÍNH như một tệp đính kèm cho mọi mục nhập lá chỉ mục phụ . Do dữ liệu và chỉ mục được đan xen thông qua Chỉ mục cụm, nên chưa có ai cố gắng thực hiện DISABLE KEYSENABLE KEYStrong InnoDB.


1
"Tôi đã nói với bạn" :-)
jynus

@jynus HÀ HÀ :-). Bạn nên đăng bình luận mysqldump của mình cho InnoDB ( dba.stackexchange.com/questions/76565/ Ấn ) như một câu trả lời.
RolandoMySQLDBA

@yoshi Tôi đang viết một bài báo dựa trên câu hỏi ban đầu của bạn, hãy theo dõi.
jynus

@yosi Như đã hứa: dbahire.com/ Từ
jynus

@RolandoMySQLDBA, Nếu InnoDB không thể bật / tắt khóa, thì nó có bị lỗi thay vì cảnh báo không?
Pacerier 23/2/2015
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.