2012-03-29 34 views
10

Tôi đã nhận thấy một số lượng đáng kể hiệu suất nếu tôi repack một bảng (ALTER TABLE foo ENGINE = INNODB) sau một khoảng thời gian, hoặc nhiều sau một khối lượng lớn INSERT/UPDATE/DELETE. Tôi không biết nếu điều này là bởi vì chỉ dẫn vv được xây dựng lại, hoặc nén không gian bảng, hoặc cái gì khác?Tối ưu hóa bảng InnoDB w/o bảng khóa

Nó tấn công tôi rằng làm điều gì đó như ALTER TABLE foo ENGINE = InnoDB nên là một phần của bảo trì bảng thông thường, tuy nhiên sử dụng tối ưu hóa hoặc ALTER khóa bảng đó là không thể chấp nhận, là có một cách tốt để làm với với một máy chủ cơ sở dữ liệu (có nghĩa là không bị lỗi đối với một cá thể khác) w/o khóa toàn bộ bảng?

Cập nhật: Sử dụng Percona 5.5.17-55

Cập nhật: SHOW VARIABLES LIKE 'InnoDB%';

+----------------------------------------+------------------------+ 
| Variable_name       | Value     | 
+----------------------------------------+------------------------+ 
| innodb_adaptive_checkpoint    | estimate    | 
| innodb_adaptive_flushing    | OFF     | 
| innodb_adaptive_hash_index    | ON      | 
| innodb_additional_mem_pool_size  | 8388608    | 
| innodb_auto_lru_dump     | 120     | 
| innodb_autoextend_increment   | 8      | 
| innodb_autoinc_lock_mode    | 1      | 
| innodb_buffer_pool_shm_checksum  | ON      | 
| innodb_buffer_pool_shm_key    | 0      | 
| innodb_buffer_pool_size    | 30064771072   | 
| innodb_change_buffering    | inserts    | 
| innodb_checkpoint_age_target   | 0      | 
| innodb_checksums      | ON      | 
| innodb_commit_concurrency    | 0      | 
| innodb_concurrency_tickets    | 500     | 
| innodb_data_file_path     | ibdata1:10M:autoextend | 
| innodb_data_home_dir     |      | 
| innodb_dict_size_limit     | 0      | 
| innodb_doublewrite      | ON      | 
| innodb_doublewrite_file    |      | 
| innodb_enable_unsafe_group_commit  | 0      | 
| innodb_expand_import     | 0      | 
| innodb_extra_rsegments     | 0      | 
| innodb_extra_undoslots     | OFF     | 
| innodb_fast_checksum     | OFF     | 
| innodb_fast_recovery     | OFF     | 
| innodb_fast_shutdown     | 1      | 
| innodb_file_format      | Antelope    | 
| innodb_file_format_check    | Barracuda    | 
| innodb_file_per_table     | ON      | 
| innodb_flush_log_at_trx_commit   | 0      | 
| innodb_flush_log_at_trx_commit_session | 3      | 
| innodb_flush_method     | O_DIRECT    | 
| innodb_flush_neighbor_pages   | 1      | 
| innodb_force_recovery     | 0      | 
| innodb_ibuf_accel_rate     | 100     | 
| innodb_ibuf_active_contract   | 1      | 
| innodb_ibuf_max_size     | 15032369152   | 
| innodb_io_capacity      | 200     | 
| innodb_lazy_drop_table     | 0      | 
| innodb_lock_wait_timeout    | 50      | 
| innodb_locks_unsafe_for_binlog   | OFF     | 
| innodb_log_block_size     | 512     | 
| innodb_log_buffer_size     | 67108864    | 
| innodb_log_file_size     | 402653184    | 
| innodb_log_files_in_group    | 2      | 
| innodb_log_group_home_dir    | ./      | 
| innodb_max_dirty_pages_pct    | 75      | 
| innodb_max_purge_lag     | 0      | 
| innodb_mirrored_log_groups    | 1      | 
| innodb_old_blocks_pct     | 37      | 
| innodb_old_blocks_time     | 0      | 
| innodb_open_files      | 300     | 
| innodb_overwrite_relay_log_info  | OFF     | 
| innodb_page_size      | 16384     | 
| innodb_pass_corrupt_table    | 0      | 
| innodb_read_ahead      | linear     | 
| innodb_read_ahead_threshold   | 56      | 
| innodb_read_io_threads     | 4      | 
| innodb_recovery_stats     | OFF     | 
| innodb_replication_delay    | 0      | 
| innodb_rollback_on_timeout    | OFF     | 
| innodb_show_locks_held     | 10      | 
| innodb_show_verbose_locks    | 0      | 
| innodb_spin_wait_delay     | 6      | 
| innodb_stats_auto_update    | 1      | 
| innodb_stats_method     | nulls_equal   | 
| innodb_stats_on_metadata    | ON      | 
| innodb_stats_sample_pages    | 8      | 
| innodb_stats_update_need_lock   | 1      | 
| innodb_strict_mode      | OFF     | 
| innodb_support_xa      | ON      | 
| innodb_sync_spin_loops     | 30      | 
| innodb_table_locks      | ON      | 
| innodb_thread_concurrency    | 8      | 
| innodb_thread_concurrency_timer_based | OFF     | 
| innodb_thread_sleep_delay    | 10000     | 
| innodb_use_purge_thread    | 1      | 
| innodb_use_sys_malloc     | ON      | 
| innodb_use_sys_stats_table    | OFF     | 
| innodb_version       | 1.0.16-12.8   | 
| innodb_write_io_threads    | 4      | 
+----------------------------------------+------------------------+ 
+0

Bạn đang sử dụng phiên bản MySQL nào ??? – RolandoMySQLDBA

+0

Đã cập nhật câu hỏi để bao gồm phiên bản MySQL – Jeremy

+0

Vui lòng thêm câu hỏi này vào câu hỏi của bạn: 'HIỂN THỊ BIẾN LÃI 'innodb%'; ' – RolandoMySQLDBA

Trả lời

24

Bạn không thể thay đổi hoặc tối ưu hóa một bảng mà không cần khóa nó. Tuy nhiên, với công cụ thay đổi lược đồ trực tuyến từ Percona Toolkit (từ chối trách nhiệm: chủ nhân của tôi), bạn có thể làm điều đó, và nó hoạt động khá tốt. Để tối ưu hóa bàn, chỉ cần sử dụng một cái gì đó như thế này:

pt-online-schema-change <options> --alter='ENGINE=InnoDB' 

http://www.percona.com/doc/percona-toolkit/2.1/pt-online-schema-change.html

+0

Tôi đã cập nhật câu hỏi để rõ ràng. Tôi sẽ nhìn vào pt-online-schema-change, cảm ơn. – Jeremy

+0

Chính xác những gì tôi đang tìm kiếm, cảm ơn bạn. – Jeremy

+0

Đọc tài liệu, tôi sẽ không sử dụng công cụ này trong các bảng InnoDB của tôi (tất cả đều có khóa ngoại). Kiểm tra http://www.percona.com/doc/percona-toolkit/2.1/pt-online-schema-change.html#cmdoption-pt-online-schema-change--alter-foreign-keys-method –

1

Về cơ bản, bạn đang thực hiện OPTIMIZE trên bàn. Đối với các bảng InnoDB, OPTIMIZE được ánh xạ tới ALTER TABLE. Trích dẫn từ hướng dẫn sử dụng Mysql:

Đối với bảng InnoDB, TÙY CHỌN TABLE được ánh xạ tới ALTER TABLE, bảng này sẽ cập nhật số liệu thống kê và không gian trống chưa sử dụng trong chỉ mục nhóm.

Khi xóa 1/2 bảng, OPTIMIZE sau là ý tưởng thực sự hay.

Tôi sẽ đưa ra đề xuất cải thiện hiệu suất. Thấy rằng bạn hỗ trợ trong cấu hình của bạn định dạng tập tin mới BARRACUDA bạn nên sử dụng nó. Tạo điều kiện cho nó thực sự dễ dàng, chỉ cần thêm vào my.cnf của bạn:

innodb_file​_format=Barracuda 

Khởi động lại máy chủ và sau đó thay đổi bảng của bạn để sử dụng có sẵn ROW_FORMAT = COMPRESSED mới:

ALTER TABLE x ROW_FORMAT=COMPRESSED; 

Từ kinh nghiệm bản thân, khi sử dụng dòng nén định dạng, kích thước bảng đã giảm xuống một nửa và nó có tác động tích cực đáng kể đến hiệu suất.

Để biết thêm chi tiết thử đi throug:

http://dev.mysql.com/doc/refman/5.5/en/innodb-compression-usage.html

http://www.mysqlperformanceblog.com/2008/04/23/testing-innodb-barracuda-format-with-compression/

+0

Có những nhược điểm nào khi sử dụng định dạng tệp mới hoặc nén hàng không? – Jeremy

+0

Sẽ có một sự gia tăng nhỏ trong việc sử dụng CPU, nhưng tất cả các thử nghiệm tôi đã thấy chỉ ra rằng không có nhược điểm. Định dạng cũ "Antelope" được giữ mặc định chủ yếu để tương thích với các phiên bản MySQL cũ hơn. Định dạng tệp Barracuda mới rất có thể sẽ trở thành mặc định trong bản phát hành MySQL chính tiếp theo. – capi

+0

Trong kinh nghiệm của tôi cho phép nén định dạng hàng chỉ có ý nghĩa nếu chiều dài hàng trung bình của bạn đủ lớn (sử dụng 'SHOW TABLE STATUS LIKE 'table_name'' để kiểm tra) và bạn có ít nhất một trường văn bản có nội dung dài. –

10

Từ MySQL 5.6.17, MySQL hỗ trợ tối ưu hóa trực tuyến của các bảng InnoDB theo mặc định.

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