Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

Tham gia bảng InnoDB với bảng MyISAM

Điều gì làm tôi bất ngờ ngay lập tức là MyISAM .

ASPECT # 1:Bản thân JOIN

Bất cứ khi nào có các liên kết liên quan đến MyISAM và InnoDB, các bảng InnoDB sẽ có hành vi khóa cấp bảng thay vì khóa cấp hàng do MyISAM tham gia vào truy vấn và MVCC không thể áp dụng cho dữ liệu MyISAM. MVCC thậm chí không thể được áp dụng cho InnoDB trong một số trường hợp.

ASPECT # 2:Sự tham gia của MyISAM

Từ một góc độ khác, nếu bất kỳ bảng MyISAM nào đang được cập nhật thông qua INSERT, UPDATE hoặc DELETE, các bảng MyISAM liên quan đến truy vấn JOIN sẽ bị khóa khỏi các Kết nối DB khác và truy vấn JOIN phải đợi cho đến khi các bảng MyISAM có thể được đọc. Thật không may, nếu có sự kết hợp giữa InnoDB và MyISAM trong truy vấn JOIN, các bảng InnoDB sẽ phải trải qua khóa ngắt quãng giống như các đối tác MyISAM của nó trong truy vấn JOIN vì bị giữ lại khi viết.

Hãy nhớ rằng MVCC sẽ vẫn cho phép các giao dịch READ-UNCOMMITTED và REPEATABLE-READ hoạt động tốt và nhất định xem dữ liệu có sẵn cho các giao dịch khác. Tôi không thể nói như vậy đối với ĐÃ ĐỌC ĐƯỢC CAM KẾT và CÓ THỂ XỬ LÝ .

ASPECT # 3:Trình tối ưu hóa Truy vấn

MySQL dựa vào thẻ số chỉ mục để xác định một kế hoạch GIẢI THÍCH được tối ưu hóa. Danh mục chỉ mục ổn định trong bảng MyISAM cho đến khi có nhiều CHÈN, CẬP NHẬT và XÓA xảy ra với bảng, theo đó bạn có thể chạy OPTIMIZE TABLE theo định kỳ chống lại các bảng MyISAM. Danh mục chỉ số InnoDB KHÔNG BAO GIỜ ỔN ĐỊNH !!! Nếu bạn chạy SHOW INDEXES FROM *innodbtable*; , bạn sẽ thấy số lượng chỉ mục thay đổi mỗi khi bạn chạy lệnh đó. Đó là bởi vì InnoDB sẽ đi sâu vào chỉ mục để ước tính cardinality. Ngay cả khi bạn chạy OPTIMIZE TABLE chống lại bảng InnoDB, điều đó sẽ chỉ chống phân mảnh bảng. OPTIMIZE TABLE sẽ chạy ANALYZE TABLE nội bộ để tạo thống kê chỉ số so với bảng. Điều đó hoạt động cho MyISAM. InnoDB bỏ qua nó.

Lời khuyên của tôi dành cho bạn là hãy dốc toàn lực và chuyển đổi mọi thứ sang InnoDB và tối ưu hóa cài đặt của bạn cho phù hợp.

CẬP NHẬT 2012-12-18 15:56 EDT

Tin hay không thì tùy bạn, vẫn có vẫn còn một vé mở khi tham gia InnoDB / MyISAM trong quá trình CHỌN CẬP NHẬT . Nếu bạn đọc nó, nó tổng hợp độ phân giải như sau: ĐỪNG LÀM VIỆC !!! .



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Lưu trữ dữ liệu trong MySQL dưới dạng JSON

  2. Làm thế nào để lấy nhiều bản ghi so với một bản ghi dựa trên mối quan hệ?

  3. Hàm không xác định mysql_connect ()

  4. Nhân bản, sao chép hoặc sao lưu bảng trong MySQL, MariaDB, Oracle, PostgreSQL, DB2 và SQLite với Tạo bảng dưới dạng SQL

  5. Đòi lại dung lượng đĩa sau khi thả cơ sở dữ liệu trong mysql