2011-08-15 27 views
8

enter image description hereCách khắc phục sự cố Chi phí và Hiệu quả trên bảng InnoDB?

Câu hỏi:

1 - Điều gì là có nghĩa là bởi trên cao? Khi tôi nhấp vào nút "Tối ưu hóa bảng" trên bảng MyISAM, dữ liệu trên cao và hiệu quả sẽ biến mất. Tôi tự hỏi nó làm gì để bàn của tôi?

2 - Tôi có cần phải quan tâm đến giá trị trên cao và hiệu quả không? Làm cách nào để khắc phục sự cố Chi phí và Hiệu quả trên bảng InnoDB?

Trả lời

8

Sửa InnoDB không nhỏ bằng một lần bấm nút. MyISAM là.

Dưới mui xe, OPTIMIZE TABLE sẽ làm điều này với một bảng MyISAM gọi mytb:

  • Tạo bảng temp trống với cùng một cấu trúc như mytb
  • dữ liệu
  • Sao chép MyISAM từ mytb vào bảng tạm
  • Drop bảng mytb
  • Đổi tên bảng tạm thời thành mytb
  • Chạy ANALYZE TABLE chống lại mytb và thống kê chỉ mục cửa hàng

ưu hóa TABLE không hoạt động theo cách đó với InnoDB vì hai lý do chính:

LÝ DO # 1: InnoDB Lưu trữ Layout

Theo mặc định, InnoDB có innodb_file_per_table người tàn tật. Tất cả mọi thứ InnoDB và vùng đất bà của nó trong ibdata1. Chạy TỐI ƯU HÓA TABLE nào sau đây để một bảng InnoDB gọi mytb:

  • Tạo bảng InnoDB tạm rỗng với cùng một cấu trúc như mytb
  • Sao chép InnoDB dữ liệu từ mytb vào bảng tạm
  • Drop bảng mytb
  • Đổi tên bảng temp để mytb
  • Run PHÂN TÍCH bẢNG chống mytb và chỉ số cửa hàng thống kê

Thật không may, bảng tạm thời được sử dụng để thu hẹp mytb được nối vào ibdata1. Tăng trưởng nhanh cho ibdata1 !!! Trong điều kiện này, ibdata1 sẽ không bao giờ co lại. Đối với vấn đề tồi tệ hơn, BẢNG ANALYZE là vô ích (Giải thích trong REASON # 2)

Nếu bạn đã bật innodb_file_per_table, bốn (4) bước đầu tiên sẽ hoạt động vì dữ liệu không được lưu trữ trong ibdata1, nhưng trong một tệp vùng bảng bên ngoài mytb.ibd. Điều đó có thể co lại.

REASON # 2: Thống kê chỉ mục luôn được tính toán lại

InnoDB không lưu trữ số liệu thống kê chỉ mục một cách hiệu quả. Trong thực tế, nếu bạn chạy BẢNG ANALYZE trên mytb, các số liệu thống kê được tạo và lưu trữ. Thật không may, theo thiết kế, InnoDB sẽ đi sâu vào các trang BTREE của các chỉ mục của nó, phỏng đoán các đặc tính quan trọng và sử dụng những con số đó để chuẩn bị cho Trình tối ưu hóa truy vấn MySQL. Đây là một dự án đang tiến hành. Trong thực tế, ANALYZE TABLE là vô ích bởi vì các số liệu thống kê chỉ mục được tính toán được ghi đè với mỗi truy vấn được thực hiện đối với bảng đó.I wrote about this in the DBA StackExchange June 21, 2011.

Percona explained this thoroughly in www.mysqlperformanceblog.com

Đối với chi phí trong MyISAM, con số đó có thể được tìm ra.

Đối với bảng MyISAM, chi phí đại diện cho phân mảnh nội bộ. Điều này khá phổ biến trong một bảng có các trải nghiệm, INSERT, UPDATE và DELETE, đặc biệt nếu bạn có các cột BLOB hoặc VARCHAR. Chạy OPTIMIZE TABLE làm cho phân mảnh như vậy biến mất bằng cách sao chép vào bảng tạm thời (tự nhiên không sao chép không gian trống).

Quay lại InnoDB, cách bạn loại bỏ hiệu quả không gian lãng phí? Bạn cần phải rearchitect ibdata1 để giữ ít thông tin hơn. Withing ibdata1 bạn có bốn loại dữ liệu:

  • Bảng dữ liệu trang
  • dữ liệu trang Index
  • Bảng MetaData
  • MVCC dữ liệu cho giao dịch

Bạn permamnently có thể di chuyển Bảng và Chỉ số Out của ibdata1 mãi mãi. Điều gì về dữ liệu và chỉ mục đã được đặt trong ibdata1?

Thực hiện theo Kế hoạch Cleanup InnoDB mà tôi được đăng ngày 29 tháng 10 năm 2010: Howto: Clean a mysql InnoDB storage engine?

+0

tôi đã không cập nhật hoặc chèn hoặc xóa bất cứ điều gì, tôi chỉ cần thay đổi myisam để innodb, sau đó giá trị của overhead đã lên đến 3.072.0KiB và giá trị hiệu quả đi xuống -3,129,344. Nó có bình thường không? Hoặc thực sự tôi cần phải thiết lập một cái gì đó trước khi thay đổi myisam để innodb để ngăn chặn vấn đề trên không/hiệu quả? – zac1987

+0

@ zac1987 trả lời này có vẻ hơi muộn, nhưng bạn có thể thử OPTIMIZE TABLE trước khi bạn thay đổi nó thành InnoDB. – Raptor

1

Trong thực tế "TỐI ƯU HÓA TABLE" là một sự lãng phí vô ích thời gian trên MyISAM, bởi vì nếu bạn phải làm điều đó, cơ sở dữ liệu của bạn là bánh mì nướng đã .

Mất một thời gian rất dài trên các bảng lớn và chặn truy cập ghi vào bảng trong khi thực hiện như vậy. Hơn nữa, nó có tác dụng rất khó chịu trên MyISAM keycache, vv

Vì vậy, trong bản tóm tắt

bảng
  • nhỏ không bao giờ cần "tối ưu hóa bảng"
  • bảng lớn không bao giờ có thể sử dụng "tối ưu hóa bảng" (hoặc thực sự MyISAM)

Có thể đạt được (gần) điều tương tự trong InnoDB chỉ đơn giản bằng cách sử dụng câu lệnh ALTER TABLE mà không làm thay đổi lược đồ (thường là ALTER TABLE t ENGINE = InnoDB). Nó không nhanh bằng MyISAM, bởi vì nó không thực hiện các tối ưu hóa bảng nhỏ mà phù hợp với bộ nhớ.

MyISAM cũng sử dụng một loạt các tối ưu hóa chỉ mục để nén các trang chỉ mục, thường tạo ra các chỉ mục khá nhỏ. InnoDB cũng không có.

Nếu cơ sở dữ liệu của bạn nhỏ, bạn không cần đến nó. Nếu nó lớn, bạn có thể không thực sự sử dụng MyISAM anyway (vì một tắt máy không có kế hoạch làm cho bảng cần xây dựng lại, mà phải mất quá lâu trên các bảng lớn). Chỉ cần không sử dụng MyISAM nếu bạn cần độ bền, độ tin cậy, giao dịch, bất kỳ mức độ đồng thời nào, hoặc thường quan tâm đến độ bền trong bất kỳ cách nào.

+0

Vì vậy, thực sự tôi không cần phải quan tâm đến vấn đề Overhead và Effective?Giá trị màu đỏ có hiển thị trên trường Trên không? – zac1987

Các vấn đề liên quan