怎麼提高Mysql執行sql匯入的速度

來源:互聯網
上載者:User

怎麼提高Mysql執行sql匯入的速度

 

 

1、如果mysql的data資料很少,記憶體足夠大,可以把data防止到記憶體盤中。

linux如下設定記憶體盤:

mount -t ramfs none /ram

預設使用記憶體一半

如果記憶體不夠大,系統有多個硬碟,則把mysql應用程式和data目錄分開到不同硬碟上。

2、mysql的表設定為myiasm,比同等條件下的innodb能快20倍以上

3、匯入完成以後才建立資料庫索引

4、匯入完成以後根據需要轉換為其他engine,比如innodb

5、多條資料插入一個表,可以使用多記錄方式:

insert into tablename values(’xxx’,'xxx’),(’yyy’,'yyy’)…;

6、如果多個mysql執行匯入,可以使用delayed

insert delayed into tablename values(’sss’,’ssss’);

7、大檔案sql檔案可以用split分成多份再導

8、同等條件下,redhat比ubuntu強很多(幾乎肯定)

9 效能調整技巧(Performance tuning tips)

1. 如果 Unix top 或 Windows 工作管理員(Task Manager) 顯示服務的 CPU 佔用率小於 70%,(shows that the CPU usage percentage with your workload is less than 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 中,使用 Unix fsync 或其它類似的方法將檔案重新整理到磁碟是異常地慢的。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。

轉載聲明:本文轉自http://hi.baidu.com/ssnh1379/blog/item/26733a1e12468103314e1579.html

====================================================================

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.