Đ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.
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 !!! .