Hoạt động ghi của Mysql innoDB cực kỳ chậm


8

Tôi đang gặp vấn đề nghiêm trọng về hiệu năng với MySQL và công cụ InnoDB. Ngay cả bảng đơn giản nhất cũng khiến các thao tác viết (tạo bảng, chèn, cập nhật và xóa) chậm khủng khiếp, như bạn có thể thấy trong đoạn trích sau.

mysql> CREATE TABLE `test` (`id` int(11) not null auto_increment,
   -> PRIMARY KEY(`id`)) ENGINE=InnoDB;
Query OK, 0 rows affected (4.61 sec)

mysql> insert into test values ();
Query OK, 1 row affected (1.92 sec)

mysql> insert into test values ();
Query OK, 1 row affected (0.88 sec)

mysql> insert into test values ();
Query OK, 1 row affected (1.10 sec)

mysql> insert into test values ();
Query OK, 1 row affected (6.27 sec)

mysql> select * from test;
+----+
| id |
+----+
|  1 |
|  2 |
|  3 |
|  4 |
+----+
4 rows in set (0.00 sec)

mysql> delete from test where id = 2;
Query OK, 1 row affected (0.28 sec)

mysql> delete from test where id = 3;
Query OK, 1 row affected (6.37 sec)

Tôi đã nhìn vào htop và thời gian chờ đợi lâu không phải vì tải CPU bất thường. Nó gần như bằng không, và việc sử dụng bộ nhớ cũng bình thường. Nếu tôi tạo cùng một bảng bằng công cụ MyISAM, thì nó hoạt động bình thường. Tệp my.cnf của tôi chứa tệp này (nếu tôi nhớ đúng, tôi đã không thay đổi bất cứ điều gì từ cấu hình Debian mặc định):

[client]
port        = 3306
socket      = /var/run/mysqld/mysqld.sock
[mysqld_safe]
socket      = /var/run/mysqld/mysqld.sock
nice        = 0

[mysqld]
user        = mysql
pid-file    = /var/run/mysqld/mysqld.pid
socket      = /var/run/mysqld/mysqld.sock
port        = 3306
basedir     = /usr
datadir     = /var/lib/mysql
tmpdir      = /tmp
language    = /usr/share/mysql/english
skip-external-locking
bind-address        = 127.0.0.1
key_buffer      = 40M
max_allowed_packet  = 16M
thread_stack        = 128K
thread_cache_size       = 8
myisam-recover         = BACKUP
max_connections        = 100
table_cache            = 64
thread_concurrency     = 10
query_cache_limit   = 1M
query_cache_size        = 40M
log_slow_queries    = /var/log/mysql/mysql-slow.log
long_query_time = 2
log-queries-not-using-indexes
expire_logs_days    = 10
max_binlog_size         = 100M

[mysqldump]
quick
quote-names
max_allowed_packet  = 16M

[isamchk]
key_buffer      = 16M
!includedir /etc/mysql/conf.d/

Tôi cũng đã cố gắng khởi động lại máy chủ, nhưng nó không giải quyết được gì.

Nhật ký truy vấn chậm không cung cấp thêm thông tin.


thông thường các thiết lập mysql mặc định của linux không được cấu hình để sử dụng innodb tối ưu. google 'cài đặt mysql linux để sử dụng innodb'.

Đây có phải là Máy ảo cục bộ cho máy trạm của bạn không?
Mannoj

Đó là một VM, nhưng không phải cục bộ. Đó là một lưu trữ trả phí.
Ximo Puig Bruguera

bạn có thể cung cấp một số iostatthông tin trong quá trình chèn, kết quả cho SHOW VARIABLES LIKE '%version%'SHOW VARIABLES LIKE '%innodb%';
altmannmarcelo

Câu trả lời:


6
  • innodb_flush_log_at_trx_commit = 2cho tốc độ tốt hơn ( =1để an toàn tốt hơn)

  • sync_binlog = 0 nếu bạn không sử dụng binlog.

  • "Batch" INSERTs - nhiều hàng trong một INSERTcâu lệnh. (Nếu bạn có nhiều, hãy thực hiện 100 lần một lúc.) LOAD DATACũng rất tuyệt vời để tải.

  • innodb_buffer_pool_size = 70% RAM có sẵn.

  • auto_commit = 1, hoặc dùng BEGIN ... COMMIT

  • thread_stack = 256K Tôi ngạc nhiên khi nó không sụp đổ với giá trị nhỏ của bạn.

Tuy nhiên, thời gian (1 giây) là vô lý. Ngay cả với mọi thứ được đặt là "sai", 0,1 giây cho một đơn giản INSERTnên được mong đợi.

Đây có phải đang chạy trong một "đám mây"? Có điều gì khác đang xảy ra?



0

Vui lòng đảm bảo bạn có innodb_buffer_pool_sizetới 80% bộ nhớ VM. Và thực hiện các thay đổi khác cho InnoDB, bộ tốt nhất cho ứng dụng của bạn. Dưới đây là một vài khuyến nghị. Trước tiên hãy thử buffer_poolvà cho tôi biết cách chèn sẽ giúp bạn.

default-storage-engine         
innodb_file_per_table          
innodb_additional_mem_pool_size    
innodb_buffer_pool_size            
innodb_thread_concurrency          
innodb_flush_log_at_trx_commit     
innodb_log_buffer_size             
innodb_log_file_size               
innodb_log_files_in_group          
innodb_max_dirty_pages_pct         
innodb_lock_wait_timeout           

Trên thực tế innodb_file_per_table có thể làm chậm nó nếu bạn có nhiều bảng. Điều này là do mysql phải gọi sync () và đợi kernel trả về cho mọi tệp dữ liệu thay vì chỉ phải gọi nó một lần.
Sarel Botha

0

Nếu cơ sở dữ liệu của bạn đã chậm, việc chạy các đợt chèn có thể làm giảm hiệu suất của bạn hơn nữa. Đặc biệt là trong InnoDB, nơi mỗi thao tác ghi được ghi lại trong nhật ký giao dịch.

Đề nghị bạn trước tiên điều chỉnh hệ thống của mình và / hoặc nâng cấp phần cứng trước khi tận dụng lợi ích của việc chèn hàng loạt trong InnoDB.


1
Ngược lại, Batch INSERT được hưởng lợi theo hai cách: (a) ít chi phí trong mạng / phân tích cú pháp / vv và (b) ít CAM KẾT hơn.
Rick James

@RickJames nói chung là đúng. Để gỡ lỗi các trường hợp cơ sở dữ liệu chậm, cách tiếp cận được đề xuất (điều chỉnh cài đặt cơ sở dữ liệu và / hoặc nâng cấp phần cứng) giúp.
Vinay Vemula
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.