innodb 優化

 
1.若是 Unixtop或 Windows任務管理器(Task Manager)顯示服務的 CPU 佔用率小於 70%,你的系統瓶頸可能在磁盤讀寫上。
   或許你提交了大量的事務,或者是緩衝池(buffer pool)過小了。將緩衝池設大點會有所幫助,但必定要注意不能大於物理內存的 80%。
 
2.在一個事務中包含幾個修改。若是事務對數據庫進行了修改,那麼在這個事務提交時 InnoDB 必須刷新日誌到磁盤上。
   由於硬盤的旋轉速度一般至多爲 167 轉/秒,那麼只要磁盤不欺騙操做系統,提交的事務數目限止也一樣爲 167 次/秒·用戶。
 
3.若是掉失最近的幾個事務無所謂的話,能夠在my.cnf文件中將參數innodb_flush_log_at_trx_commit設置爲 0。
   InnoDB 不管如何老是嘗試一秒刷新(flush)一第二天志,儘管刷新並不能獲得保證。
 
4.將日誌文件(log files)設大一點,使日誌文件的總和正好與緩衝池(buffer pool)同樣大。
   當 InnoDB 用光日誌文件的空間時,它不得不在一個時間點上將緩衝池內修改過的內容寫到磁盤上。
   小的日誌文件可能引發沒必要要的磁盤寫操做。可是大的日誌文件的缺點就是在數據恢復時將佔用較長的時間。
 
5.一樣 log buffer 儘可能設大點,好比說 8 MB。
 
6.若是要存儲變長的字符串或字段可能會包含大量的 NULLs,請使用VARCHAR型字段代替CHAR。
   一個CHAR(n)字段老是使用 n bytes 來存儲數據,即便這個字符串很短或是一個 NULL 值。
   較小的表更加適合緩衝池同時可以減小磁盤 I/O 。
 
7.(適合從 3.23.41 以上版本) 在某些版本的 Linux 和 Unixes 中,使用 Unixfsync或其它相似的方法將文件刷新到磁盤是異常地慢的。
   InnoDB 默認的方法就是fsync。若是你對數據庫系統的磁盤寫性能不能感到滿意,你能夠嘗試在my.cnf中將innodb_flush_method設置爲O_DSYNC,
   儘管O_DSYNC選項在多數的系統上看起來比較慢。
 
8.在向 InnoDB 導入數據時,請確認 MySQL 沒有打開autocommit=1。
   不然每一個插入語句都要將 log 刷新到磁盤。在你的 SQL 導入文件的第一行加入  set autocommit=0;並在最後一行加入commit;
   若是使用mysqldump選項--opt,你將會獲得一個快速導入 InnoDB 表的轉儲(dump)文件,甚至能夠再也不使用上面所提的set autocommit=0; ... commit;。
 
9.當心 insert 集全的大回滾(roolback):在插入時 InnoDB 使用插入緩衝來減小磁盤 I/O,但在相應的回滾中卻沒有使用這樣的機制。
   一個 disk-bound rollback 可能會花費相應插入時間的 30 倍。若是發生一個失控的回滾,你能夠查看第 6.1 章節的技巧來中止它。
 
10.一樣也要當心一個大的 disk-bound 的操做。使用DROP TABLE或TRUNCATE(從 MySQL-4.0 以上) 來清空一個表,而不要使用DELETE FROM yourtable。
 
11.若是須要插入大量記錄行可使用多行(multi-line)的INSERT來減小客戶端與服務器端的通訊開銷:
    INSERT INTO yourtable VALUES (1, 2), (5, 5);這個技巧對插入任何表均有效,而不單單是 InnoDB。
 
12.若是在輔鍵上有UNIQUE約束,從 3.23.52 和 4.0.3 開始,能夠經過在一個導入會話中將惟一鍵檢查(uniqueness check)關閉來提升數據導入速度:
     SET UNIQUE_CHECKS=0;一個大的表導入這將減小大量的磁盤 I/O,由於這時 InnoDB 可能使用自身的插入緩衝來分批地記錄輔助索引。
 
13.若是在表中有一個子FOREIGN KEY約束,從 3.23.52 和 4.0.3 開始,能夠經過在一個導入會話中將外鍵檢查(foreign key check)關閉來提升數據導入速度:
     SET FOREIGN_KEY_CHECKS=0; 對一個大的表導入這將減小大量的磁盤 I/O。
相關文章
相關標籤/搜索