2012-03-30 50 views
0

這是Uday。我用一個innodb小表對寫入性能有問題。Mysql:在我的本地機器上觀察到插入和更新都很慢

There is a table called "wlists" on my local machine(mysql 5.1.X). 
    It has 5 attributes and has less than 1000 rows. 
    By default, innodb_flush_log_at_trx_commit is set to 1 ; 

    Now the thing is that 
    every insert/update it is taking 0.04 seconds, 
    this is horrible because i can do just 54K inserts per hour. 

    When innodb_flush_log_at_trx_commit set to 2, its working fine. 

如何獲得與innodb_flush屬性設置爲1相同的性能只.. ..?

Here are some other details that may help in addressing this: 
    load on the machine  : Quite normal 
    innodb_log_file_size  : 1MB 
    innodb_buffer_pool_size : 8MB 
    innodb_thread_concurrency : 8 
    Query      : update wlists set customer_id = 1000 where id = 300; 

我試圖像OPTIMIZE TABLE不同的選項,增加了日誌緩衝區,檢查網絡延遲,但沒有一個人工作。我會非常感謝那些願意幫助我的人。

這裏是表的DESC和EXPLAIN。

mysql> DESC wlists ; 
    +-------------+--------------+------+-----+---------+----------------+ 
    | Field  | Type   | Null | Key | Default | Extra   | 
    +-------------+--------------+------+-----+---------+----------------+ 
    | id   | int(11)  | NO | PRI | NULL | auto_increment | 
    | customer_id | int(11)  | NO | MUL | NULL |    | 
    | name  | varchar(45) | YES |  | NULL |    | 
    | created  | datetime  | YES |  | NULL |    | 
    | modified | varchar(255) | YES |  | NULL |    | 
    +-------------+--------------+------+-----+---------+----------------+ 
    5 rows in set (0.01 sec) 

    mysql> explain select customer_id from wlists where id = 300 ; 
    +----+-------------+-----------+-------+---------------+---------+---------+-------+------+ 
    | id | select_type | table  | type | possible_keys | key  | key_len | ref | rows | Extra | 
    ----+-------------+-----------+-------+---------------+---------+---------+-------+------+ 
    | 1 | SIMPLE  | wishlists | const | PRIMARY  | PRIMARY | 4  | const   | 1 |  | 
    +----+-------------+-----------+-------+---------------+---------+---------+-------+------+-------+ 
    1 row in set (0.00 sec) 

SELECT正在工作正常。問題僅在於UPDATE/INSERT。

問候, UDAY

+0

沒有模式和索引列表,甚至猜測都很難。例如,非常多的索引可能是一個原因。 – 2012-03-30 14:10:03

+0

將解釋更新wlists的輸出設置爲customer_id = 1000,其中id = 300;' – Cfreak 2012-03-30 14:10:42

+0

Joachim&freck,我已經更新了所需的。 -Uday – Uday 2012-03-30 14:33:44

回答

1

的innodb_flush_log_at_trx_commit設置爲1,總會引起的寫入性能下降因爲InnoDB將等待操作系統每次操作後磁盤成功返回。儘管如此,請注意操作系統有時會基於自己的緩存而存在。

但是設置innodb_flush_log_at_trx_commit == 1也是保證ACID和完整數據恢復(假設操作系統不會太多)的唯一方法。所以這是一個折衷。處理這個問題的理想方法是使用具有自己的寫緩存的電池備份存儲系統。這樣,您就可以獲得寫入緩存的優勢,而不會出現數據恢復問題。當然,您必須確保電池備份完全維持,並且在電池經過定期維護週期時您將遇到寫入速度問題。

+0

Thanq Kernel。這似乎是正確的。但是在1000行的桌子上每小時需要50-60K的時間,並且可以選擇這些選項,這看起來不太好。我覺得這種行爲背後還有其他的東西。 – Uday 2012-03-30 14:25:23

+0

@Uday:我認爲這背後還有其他的東西。我有兩臺機器,新機器在各個方面都具有更高的規格,測量的磁盤寫入速度是新服務器的兩倍,而新服務器上的MySQL更新速度比舊服務器慢100倍。我必須設置innodb_flush_log_at_trx_commit = 2以允許數據庫可用。緩慢的服務器是在CentOS 6.2 64位內核2.6.32-220.4.1.el6.x86_64上運行的MySQL 5.1.61-log,你能讓我知道你的設置,看看是否有共同點。我沒有在這個具體問題上找到很多關於這方面的信息。 – 2012-04-11 12:13:35

+0

嗨理查德,我觀察到在32位和64位都有相同的行爲。我的Ubuntu 8.10。 EXPLAIN計劃說什麼關於您的更新的等效選擇是什麼。你的意思是插入也慢你的更新...? – Uday 2012-04-11 13:33:08