Sự khác biệt giữa bảng tối ưu hóa và bảng phân tích trong mysql là gì


29

Sự khác biệt giữa bảng tối ưu hóa và bảng phân tích trong mysql là gì? Tôi đã đọc các tài liệu trực tuyến, nhưng không chắc sự khác biệt là gì.

Câu trả lời:


28

Để mở rộng câu trả lời của @ MitchWheat (+1 để trả lời trực tiếp trước):

ANALYZE TABLE kiểm tra phân phối khóa và lưu trữ chúng trong Information_SCHema.STATISTICS .

BẢNG TỐI ƯU thực hiện BẢNG PHÂN TÍCH sau khi thực hiện nén bảng. Tương đươngOPTIMIZE TABLE mydb.mytable;nếu bảng là MyISAM là:

ALTER TABLE mydb.mytable ENGINE=MyISAM;
ANALYZE TABLE mydb.mytable;

MyISAM

Đối với bảng MyISAM mydb.mytable trong datadir /var/lib/mysql, bạn có các tệp sau:

  • /var/lib/mysql/mydb/mytable.frm
  • /var/lib/mysql/mydb/mytable.MYD (dữ liệu)
  • /var/lib/mysql/mydb/mytable.MYI (chỉ mục)

OPTIMIZE TABLE mydb.mytablesẽ thu nhỏ .MYD.MYIcác tập tin cho bảng.

Điều này không giống với InnoDB. Đây là cách nó khác nhau:

InnoDB ( kích hoạt innodb_file_per_table )

Dữ liệu và chỉ mục của mỗi bảng được lưu trữ trong một tệp không gian bảng bên ngoài. Cho datadir/var/lib/mysql và bảng mydb.mytable, nó sẽ được lưu trữ như sau:

  • /var/lib/mysql/mydb/mytable.frm
  • /var/lib/mysql/mydb/mytable.ibd

Khi OPTIMIZE TABLE mydb.mytableđược thực thi, mytable.ibdđược thu nhỏ.

InnoDB ( vô hiệu hóa innodb_file_per_table )

Chỉ /var/lib/mysql/mydb/mytable.frmtồn tại. Tất cả các trang dữ liệu và chỉ mục cho bảng mydb.mytableđược lưu trữ trong tệp không gian bảng hệ thống /var/lib/mysql/ibdata1.

Khi OPTIMIZE TABLE mydb.mytableđược thực thi, các trang dữ liệu và chỉ mục được viết liền kề trong ibdata1. Thật không may, điều này làm cho ibdata1 phát triển nhảy vọt.

Xem Đại diện hình ảnh từ Percona CTO Vadim Tkachenko

Hệ thống nước InnoDB

CẬP NHẬT 2013 / 02-26 22:33 EST

Bạn bình luận là

Tôi nghĩ rằng, tối ưu hóa bảng cho innodb không được hỗ trợ. Tôi nhận được một tin nhắn, chỉ mục sẽ được tạo lại. Làm thế nào nó hoạt động?

Tôi đã thử nó

Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 1
Server version: 5.5.29 MySQL Community Server (GPL)

Copyright (c) 2000, 2012, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> use test
Database changed
mysql> create table dat (a int, primary key (a));
Query OK, 0 rows affected (0.08 sec)

mysql> insert into dat values (1),(2),(3),(4),(5),(6),(7),(8),(9),(10);
Query OK, 10 rows affected (0.04 sec)
Records: 10  Duplicates: 0  Warnings: 0

mysql> analyze table dat;
+----------+---------+----------+----------+
| Table    | Op      | Msg_type | Msg_text |
+----------+---------+----------+----------+
| test.dat | analyze | status   | OK       |
+----------+---------+----------+----------+
1 row in set (0.06 sec)

mysql> optimize table dat;
+----------+----------+----------+-------------------------------------------------------------------+
| Table    | Op       | Msg_type | Msg_text                                                          |
+----------+----------+----------+-------------------------------------------------------------------+
| test.dat | optimize | note     | Table does not support optimize, doing recreate + analyze instead |
| test.dat | optimize | status   | OK                                                                |
+----------+----------+----------+-------------------------------------------------------------------+
2 rows in set (0.14 sec)

mysql>

Bạn nói đúng. Bạn không thể chạy OPTIMIZE TABLEnhư một hoạt động đơn lẻ. Những gì InnoDB làm thay vào đó là như sau:

ALTER TABLE mydb.mytable ENGINE=InnoDB;
ANALYZE TABLE mydb.mytable;

Bạn cũng có thể tự chạy các bước này.

Tuy nhiên, trong tất cả sự trung thực, bạn không cần phải chạy theo ANALYZE TABLEbảng InnoDB vì mỗi lần thực hiện truy vấn, Công cụ lưu trữ InnoDB sẽ thực hiện ước tính về số lượng thẻ dựa trên việc đi qua các trang trong các chỉ mục. Nếu có một số lượng lớn INSERTs, UPDATEsDELETEs, sau đó bạn sẽ cần phải ANALYZE TABLE. Khi có số lượng lớn DELETEs, thì ALTER TABLE mydb.mytable ENGINE=InnoDB;cần phải thu nhỏ bảng.

Tôi thực sự đã viết bài viết về sự vô ích của ANALYZE TABLEInnoDB trong một số trường hợp nhất định:


Tôi nghĩ rằng, tối ưu hóa bảng cho innodb không được hỗ trợ. Tôi nhận được một tin nhắn, chỉ mục sẽ được tạo lại. Làm thế nào nó hoạt động?
Boolean

@RolandoMySQLDBA Tôi không chắc có nghĩa gì khi bạn nói, "bạn không thể chạy OPTIMIZE TABLE." Khi bạn OPTIMIZE TABLEcho một bảng InnoDB, MySQL đang thực hiện ALTER TABLE ... ENGINE=InnoDBANALYZE TABLE ...thao tác cho bạn khi nó nói "thực hiện tái tạo + phân tích bảng thay thế."
Michael - sqlbot

@ Michael-sqlbot Như thể hiện trong câu trả lời của tôi, tôi đã chạy OPTIMIZE TABLE dat;trong MySQL 5.5,29 và nó đã phàn nàn ngay lập tức Table does not support optimize, doing recreate + analyze instead. Đó là lý do tại sao tôi khuyên bạn nên ALTER TABLE dat ENGINE=InnoDB; ANALYZE TABLE dat;.
RolandoMySQLDBA

Phải, nhưng tôi sẽ khẳng định rằng nó đã xảy ra ngay lập tức cho bạn vì bảng bạn đã kiểm tra rất nhỏ. Khi bạn OPTIMIZE TABLEsử dụng InnoDB, máy chủ thực sự thực hiện ALTER TABLE ... ENGINE=InnoDBvà thực hiện ANALYZE TABLEphía sau hậu trường trước khi trả lại phản hồi đó ... vì vậy bạn thực sự có thể chạy OPTIMIZE TABLEtrên InnoDB và đạt được hiệu quả như mong muốn.
Michael - sqlbot

15

Phụ thuộc vào phiên bản MySQL và công cụ lưu trữ của bạn, nhưng nói chung:

BẢNG TỐI ƯU Bảng phân tích, lưu trữ phân phối khóa cho một bảng, lấy lại không gian chưa sử dụng và phân mảnh tệp dữ liệu.

BẢNG PHÂN TÍCH Chỉ phân tích bảng và lưu trữ phân phối khóa.

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.