插入分析php
MySQL中插入一個記錄須要的時間由下列因素組成,其中的數字表示大約比例:html
若是咱們每插入一條都執行一個SQL語句,那麼咱們須要執行除了鏈接和關閉以外的全部步驟N次,這樣是很是耗時的,優化的方式有一下幾種:mysql
每種方式執行的性能以下。sql
Innodb引擎數據庫
InnoDB 給 MySQL 提供了具備事務(commit)、回滾(rollback)和崩潰修復能力(crash recovery capabilities)的事務安全(transaction-safe (ACID compliant))型表。InnoDB 提供了行鎖(locking on row level)以及外鍵約束(FOREIGN KEY constraints)。apache
InnoDB 的設計目標是處理大容量數據庫系統,它的 CPU 利用率是其它基於磁盤的關係數據庫引擎所不能比的。在技術上,InnoDB 是一套放在 MySQL 後臺的完整數據庫系統,InnoDB 在主內存中創建其專用的緩衝池用於高速緩衝數據和索引。安全
測試環境服務器
Macbook Air 12mid apache2.2.26 php5.5.10 mysql5.6.16框架
總數100W條數據性能
插入完後數據庫大小38.6MB(無索引),46.8(有索引)
MyIASM引擎
MyISAM 是MySQL缺省存貯引擎。設計簡單,支持全文搜索。
測試環境
Macbook Air 12mid apache2.2.26 php5.5.10 mysql5.6.16
總數100W條數據
插入完後數據庫大小19.1MB(無索引),38.6(有索引)
總結
我測試的數據量不是很大,不過能夠大概瞭解這幾種插入方式對於速度的影響,最快的必然是Load Data方式。這種方式相對比較麻煩,由於涉及到了寫文件,可是能夠兼顧內存和速度。
引用:http://www.codeceo.com/article/mysql-insert-compare.html
2、PHP+MySQL百萬數據插入
第一種方法:使用insert into 插入,代碼以下:
最後顯示爲:23:25:05 01:32:05 也就是花了2個小時多! 這是時間擼幾把 都行。。。
第二種方法:使用事務提交,批量插入數據庫(每隔10W條提交下)
最後顯示消耗的時間爲:22:56:13 23:04:00 ,一共8分13秒 ,代碼以下:
時間是一下縮短很多但仍是有點長。
第三種方法:使用優化SQL語句:將SQL語句進行拼接,使用 insert into table () values (),(),(),()而後再一次性插入,若是字符串太長,
則須要配置下MYSQL,在mysql 命令行中運行 :set global max_allowed_packet = 2*1024*1024*10;消耗時間爲:11:24:06 11:24:11;
我擦 插入200W條測試數據僅僅用了不到6秒鐘!代碼以下:
可能這裏又會有人說數據不大 sql文件導出來也是小200M 5秒鐘 對一表格 進行200萬條數據 速度已經不錯了。
這個再跟你們說一個 TP框架了的 addall方法
速度也很快 可是還不如原生。
着了說一下其中可能會遇到的問題 好比試驗時可能會出現PHP內存限制 和mysql的SQL語句溢出甚至宕機
這裏數幾個方案
一、能夠進行相關的配置php.ini my.ini 等
二、你們能夠用隊列進行分批處理
三、或者本身的一些方法