MySQL系列教程(四)

文件打開數(open_files)


咱們如今處理MySQL故障時,發現當Open_files大於open_files_limit值時,MySQL數據庫就會發生卡住的現象,致使Nginx服務器打不開相應頁面。這個問題你們在工做中應注意,咱們能夠用以下命令查看其具體狀況:php

 
show global status like 'open_files';
+---------------+-------+
|
Variable_name | Value |
+---------------+-------+
|
Open_files | 1481 |
+---------------+-------+
mysql> show global status like 'open_files_limit';
+------------------+-------+
|
Variable_name | Value |
+------------------+--------+
|
Open_files_limit | 4509 |
+------------------+--------+

比較合適的設置是:Open_files / Open_files_limit * 100% < = 75%java


InnoDB_buffer_pool_cache合理設置


InnoDB存儲引擎的緩存機制和MyISAM的最大區別就在於,InnoDB不只僅緩存索引,同時還會緩存實際的數據。此參數用來設置InnoDB最主要的Buffer的大小,也就是緩存用戶表及索引數據的最主要緩存空間,對InnoDB總體性能影響也最大。
不管是MySQL官方手冊仍是網絡上許多人分享的InnoDB優化建議,都是簡單地建議將此值設置爲整個系統物理內存的50%~80%。這種作法其實不妥,咱們應根據實際的運行場景來正確設置此項參數。


不少時候咱們會發現,經過參數設置進行性能優化所帶來的性能提高,並不如許多人想象的那樣會產生質的飛躍,除非是以前的設置存在嚴重不合理的狀況。咱們不能將性能調優徹底依託與經過DBA在數據庫上線後進行參數調整,而應該在系統設計和開發階段就儘量減小性能問題。(重點在於前期架構合理的設計及開發的程序合理)。mysql


MYSQL監控管理工具介紹


MySQL愈來愈被更多企業接受,隨着企業發展,MySQL存儲數據日益膨脹,MySQL的性能分析、監控預警、容量擴展議題愈來愈多。「工欲善其事,必先利其器」,那麼咱們如何在進行MySQL性能分析、監控預警、容量擴展問題上獲得更好的解決方案,就要利用各類工具來對MySQL各類指標進行分析。本文是讀書筆記,下面說起的工具,讀者可能都用過,或打算準備是使用。
MySQL服務器的發佈包沒有包含那些能完成許多常見任務的工具,例如監控服務器的工具、比較服務器間數據的工具。咱們把這些工具分紅如下幾類:界面、監控、分析和輔助工具。
linux


帶界面的工具


一、MySQL可視化工具


這些工具均可以避免費使用: 
a、MySQL查詢瀏覽器(MySQL Query Browser):這個不用說了…
b、MySQL管理員(MySQL Administrator):功能集中在服務器管理上,因此它最適合DBA使用,而不是開發人員和分析人員。它能夠幫助DBA把建立備份 、建立用戶並分配權限、顯示服務器日誌和狀態信息等過程進行自動化處理。它還包括了一些基本的監控功能,例如圖形化的狀態變量顯示,可是它沒有下文裏會提到的交互式監控工具那麼靈活。
c、MySQL遷移工具箱(MySQL Migration Tookit):能夠幫你把數據從別的數據庫系統遷移到MySQL裏。
d、MySQL工做臺(MySQL Workbench):MySQL的建模工具。


ios

二、SQLyog


SQLyog是最經常使用的MySQL可視化工具,只能用於win下。
nginx



三、phpMyAdmin


phpMyAdmin是一款很流行的管理工具,它基於Web界面來管理MySQL服務器。有不少支持者,但反對者也很多。
git


監控工具


MySQL監控是一個很大複雜的任務,不一樣的應用有着不一樣的需求。「監控」是你們濫用的術語之一,承載了幾重意思。咱們講到的監控工具被分爲非互動的和互動的兩類。非互動監控經常就是一個自動化系統,它接收系統的測量值,若是有超出安全範圍的,就經過發出警告提醒管理員。互動監控工具可讓你實時地觀測服務器。 
你可能對監控工具在其餘方面的差異也很感興趣,例如被動監控和主動監控,後者會發送報警信息並做出初步反應(就像Nagios同樣);或者你可能正在尋找這樣一工具:它能夠建立一個信息倉庫,而不只僅是顯示當前的統計信息。有許多監控系統不是專爲監控MySQL而設計的,它們就是一個通用系統,裏面設計了一個週期性的任務,定時去檢查各種資源的狀態,例如像服務器、路由器、以及各類軟件(包括MySQL)。它們經常會提供一個插件架構,同時有一個預訂的MySQL插件可供使用。這樣的一些系統可以記錄監控對象的狀態,並經過web界面用圖形化的形式表示出來。當監控對象出現問題,或者狀態值超過安全範圍時,它們還能發送報警信息,或者執行一個初始化的動做。
非交互性工具


Nagiosgithub


監控界流行一句話:只要用順了Nagios,你就永遠不會再想到其它監控系統。
對於Nagios本blog會持續推出相關文章,如今只是引用Nagios官方的介紹:
Nagios是一款用於系統和網絡監控的應用程序。它能夠在你設定的條件下對主機和服務進行監控,在狀態變差和變好的時候給出告警信息。
Nagios最初被設計爲在Linux系統之上運行,然而它一樣能夠在類Unix的系統之上運行。
Nagios更進一步的特徵包括:監控網絡服務(SMTP、POP三、HTTP、NNTP、PING等);
監控主機資源(處理器負荷、磁盤利用率等);
簡單地插件設計使得用戶能夠方便地擴展本身服務的檢測方法;
並行服務檢查機制;
具有定義網絡分層結構的能力,用」parent」主機定義來表達網絡主機間的關係,這種關係可被用來發現和明晰主機宕機或不可達狀態;
當服務或主機問題產生與解決時將告警發送給聯繫人(經過EMail、短信、用戶定義方式);
具有定義事件句柄功能,它能夠在主機或服務的事件發生時獲取更多問題定位;
自動的日誌回滾;能夠支持並實現對主機的冗餘監控;可選的WEB界面用於查看當前的網絡狀態、通知和故障歷史、日誌文件等;
下面是可代替Nagios的工具:
web


Zenosssql

Zenoss是用Python編寫的,擁有基於瀏覽器的用戶界面,並使用了Ajax使操做更加快捷而富有效率。它將監控、報警、趨勢顯示、圖表顯示和記錄歷史數據等功能合成在一個統一的工具裏,它還能在網上自動發現資源,在默認狀況下,Zenoss使用SNMP從遠程機器上收集數據,但它也可使用SSH,而且支持Nagios插件。


Hyperic HQ
Hyperic HQ是一款基於Java的監控系統,它的目標跟其餘同類別的軟件不太同樣,它要成爲企業級的監控系統。跟Zenoss同樣,它也能自動發現資源,支持Nagios插件,可是它的邏輯組織和架構很不同,顯得有點龐大。至於它是否是合適你的需求,那要看你的參數設置和監控的方式了。


OpenNMS
OpenNMS是由Java編寫的,擁有一個活躍的開發者社區。它具有了常規的功能,例如監控和報警,也加入了圖表和趨勢顯示的功能。它的目標是高性能、伸縮性、自動化以及良好的兼容性。跟Hyperic同樣,它也企圖成爲一款企業級的監控軟件,能夠用於大型的關鍵系統上。


Groundwork Open Source
Groundwork Open Source其實是基於Nagios的,它把Nagios和其餘幾個工具集成爲一個系統,並安上一個統一的門戶界面。描述它的最好方法可能就是:若是你對Nagios、Cacti及其餘工具很熟悉,而且可以花大量的時間把它們無縫地集成在一塊兒的話,你也能在家庭做坊裏作一個出來。


Zabbix
Zabbix是一個開源監控系統,在許多方面跟Nagios很相像,可是也有一些關鍵的不一樣點。例如:它把全部配置信息和其餘數據都存放在一個數據庫裏,而不是放在配置文件裏;它比Nagios存儲了更多類型的數據,這樣能夠生成更好的趨勢圖和歷史報告。它的網絡圖表和可視化功能也優於Nagios。不少使用它的人發現它更易配置,更具備兼容性。提及來它也能比Nagios少,它的報警功能也不夠高級。


MySQL監控和建議服務


MySQL本身的監控方案就是設計用來監控MySQL實例的,但也可以監控主機的一些關鍵方面。這個工具不是開源的,須要MySQL企業訂閱費。
MONyog
MONyog是一個輕量級的無代理的監控系統,它跟以上那些工具備着不一樣實現方法:它的底層是一個JavaScript引擎,全部配置都是經過JavaScrpt對象模型來完成的。它被設計爲在桌面系統上運行,運行時它會在一個閒置的端口上打開一個HTTP監聽器。這樣,你就能夠把你的瀏覽器指向這個端口,查看MySQL服務器的信息了,這信息都是結合了Javascript和Flash來表示的。MONyog實際上有交互式和非交互式兩種類型,所以,你能夠把兩種類型的監控功能都嘗試着用用看。

基於RRDTool的系統


嚴格地說,RRDTool不算是一個監控系統,可是,它很重要,有必要在此提到一下。不少組織裏都是使用幾種腳本或程序–這些通常都是自制的–從服務器那裏讀取信息,而後再保存到循環數據庫(Round-robin database,RRD)文件裏。在許多要獲取記錄生成圖表的環境下,RRD文件是一個很合適的解決方案。它們能聚合輸入的數據,若是輸入數據值沒有定期在隨後提交進行時,還能在隨後插入這些丟失的數據。它們還都帶有強大的圖表工具,可以生成漂亮的不同凡響的圖表。如今已經有一些基於RRDTOOL的系統可供使用了。


a、Muti Router Traffic Grapher,或者叫MRTG就是一款典型的基於RRDTOOL的系統。它真正的設計初衷是記錄網絡數據流,可是它也被擴展用來記錄和圖表化表示其餘一些東西。


b、Munin是一個能爲你採集數據的系統,將它放入RRDTool後,就會根據數據生成不一樣粒度的圖表。它能從配置信息裏生成靜態的HTML文件,這樣你就能夠輕鬆地瀏覽,查看趨勢狀況。


c、Cacti是另一個經常使用的圖表和趨勢顯示系統。它的工做方式是:從系統裏獲取數據,而後保存在RRD文件裏,而後用PHP Web界面的形式,使用RRDTool把數據以圖表的形式展現出來。這個顯示界面也是配置和管理界面(配置信息存儲在一個MySQL服務器裏)。它是模板驅動的,所以,你能夠本身定義模板,並放到你的系統裏使用。


d、Cricket是一個用Perl編寫的跟Cacti相似的系統,使用的是基於文件的配置系統。Ganglia也跟Cacti相似,但它的設計初衷是永遠監控羣集和系統網絡,所以,你能夠查看到由許多服務器信息聚合獲得的結果,也能夠按照你的意願,查看單獨某臺服務器的信息。(Cacti和Cricket沒法顯示聚合數據。)
以上這些系統均可以被用做MySQL系統信息的收集、記錄、圖表化數據和報告,它們在用途方面差別較小,都具有了不一樣程度的兼容性。可是,它們缺少真正意義上的兼容性,好比當某些東西出錯時,它要可以有針對性地發送報警信息給某些人。它們中的一些甚至沒有「錯誤」的概念。因此,有些人把這一點看做是此類系統的一大缺點,以爲最好仍是把記錄、圖表化表示、報警這幾項功能都獨立開來。事實上,Munin特意設計了使用Nagios來做爲它的報警系統。然而,對於其餘幾個來講,這的確是缺點。另外還有一個缺點就是安裝和配置這樣一個系統,使其能徹底知足你需求,須投入不少時間和努力,不過,這一點也並非這樣。


最後,RRD文件沒法讓你使用SQL或其餘標準方法來查詢它裏面的數據。並且,在默認狀況下,它永遠會以一種剛好的粒度來存儲數據,許多MySQL管理員就不肯意接受這種限制,轉而選擇一個關係數據庫來存儲這些歷史數據。


交互性工具


交互性工具就是那些在你須要時就能夠啓動起來,並以視圖顯示的形式不斷獲取最新服務器狀態的軟件。


innotop

innotop是一個經過文本模式顯示MySQL和InnoDB的監測工具。它有不少特色,快速的配置的,易於使用等。它吸收了MYTOP的精華這使它變得更增強大。innotop是用PERL語言寫成的,這是它能更加靈活的使用在各類操做平臺之上,它能詳細的的監控出當前MYSQL和INNODB運行的狀態,以便維護人員根據結果合理的優化MYSQL,讓MYSQL更穩定更高效的運行。安裝INNOTOP工具很是的簡單,既然是由PERL寫的,固然須要PERL環境和相關的工具包。在安裝以前先要肯定你的系統安裝了Time::HiRes,Term::ReadKey,DBI,DBD::mysql這四個包。安裝能夠把包下載下來經過編譯安裝完成也能夠用PERL模塊安裝方式來完成。

mtop

是一個顯示MySQL服務器查詢狀態的監視器。功能包括顯示完成的查詢進程,顯示查詢優化的信息及殺死一個查詢。附加功能包括服務器性能統計,配置信息和調整技巧提示。


mytop

mytop就是類似top的MySQL監察工具。執行mytop後,它會每隔幾秒更新一次,並且也能夠針對性地監察某一個資料庫。


分析工具


分析工具能夠幫你自動化那些單調乏味的工做,如監測服務器,找出還能夠優化和調優的功能區域。這些工具能夠做爲解決性能問題的良好開端。


HackMySQL 工具(這個很出名,惋惜已中止更新) 

一、Mysqlreport
二、Mysqlsla
三、Maatkit分析工具


MySQL的輔助工具


MySQL裏有幾個工具是爲了消除MySQL提供的功能與它自帶的命令行工具之間的隔閡。
a、MySQL Proxy
b、Dormando的MySQL代理


phpMyAdmin安裝詳細步驟

安裝nginx


Nginx須要依賴下面3個包


1. gzip 模塊須要 zlib 庫 ( 下載: http://www.zlib.net/ )  zlib-1.2.8.tar.gz
2. rewrite 模塊須要 pcre 庫 ( 下載: http://www.pcre.org/ )  pcre-8.21.tar.gz
3. ssl 功能須要 openssl 庫 ( 下載: http://www.openssl.org/ )  openssl-1.0.1.tar.gz

注意:


若是用源碼安裝的話,後面nginx安裝的時候須要指定 --with-pcre 對應的壓縮包路徑,若是用二進制包安裝則不需指定
依賴包一鍵安裝: yum -y install zlib zlib-devel openssl openssl--devel pcre pcre-devel

採用源碼包安裝命令


openssl:
    tar -xzvf openssl-1.0.1.tar.gz
    cd openssl-1.0.1
    ./config(注意) && make && make install
    
pcre:
    tar -xzvf pcre-8.21.tar.gz
    cd pcre-8.21
    ./configure  && make && make install
    
zlib:
    tar -xzvf zlib-1.2.8.tar.gz
    cd zlib-1.2.8
    ./configure  && make && make install


nginx安裝命令


./configure --sbin-path=/usr/local/nginx/nginx --conf-path=/usr/local/nginx/nginx.conf --pid-path=/usr/local/nginx/nginx.pid --with-http_ssl_module --with-pcre=../pcre-8.38 --with-zlib=../zlib-1.2.8 --with-openssl=../openssl-1.0.2g
--with-http_stub_status_module --user=nginx --group=nginx


安裝後的配置


本文主要講mySQL對於nginx的優化和基本操做不做描述,讀者能夠自行參考相關文檔。
按照上述過程nginx會被安裝在 /usr/local/nginx目錄。



所以在更改了nginx的核心配置文件nginx.conf後可使用以下命令進行啓動


/usr/local/nginx/nginx –c /usr/local/nignx/nginx.conf


安裝FCGI組件


Nginx不像apache,默認支持php功能具備php相關的模塊。
Nginx是經過fcgi套件結合php來實現支持解析php功能的。


安裝fcgi


yum install –y spawn-fcgi fcgi-devel fcgi

以上步驟執行完畢後,咱們安裝了:


spawn-fcgi

這個東西特別有意思,由於nginx默認是不支持cgi的,而gitweb是用cgi寫的,所以咱們才安裝fastcgi,而fastcgi又要經過spawn-fcgi來啓動。。。所以。。。必需要裝spawn-fcgi。


fcgi-devel 和 fcgi
它們都屬於fastcgi運行時的lib庫。


從如下網址下載該組件:
https://codeload.github.com/gnosek/fcgiwrap/legacy.tar.gz/master
運行如下命令


cd fcgiwrap
autoreconf –I 
configure
make
make install


所有安裝完後注意檢查如下必要文件是否存在
  • /etc/init.d 目錄下有一個spawn-fcgi程序
  • /usr/bin 目錄下有一個spawn-fcgi程序
  • /var/www/git目錄下是gitweb全部的文件(網頁版git)
  • /etc/目錄下有一個gitweb.conf文件
  • /etc/sysconfig/目錄下有一個spawn-fcgi文件

修改/etc/sysconfig/spawn-fcgi文件


# You must set some working options before the "spawn-fcgi" service will work.
# If SOCKET points to a file, then this file is cleaned up by the init script.
#
# See spawn-fcgi(1) for all possible options.
#
# Example :
#SOCKET=/var/run/php-fcgi.sock
#OPTIONS="-u apache -g apache -s $SOCKET -S -M 0600 -C 32 -F 1 -P /var/run/spawn-fcgi.pid -- /usr/bin/php-cgi"


以上是原來文件的內容
修改後的內容以下顯示:


# You must set some working options before the "spawn-fcgi" service will work.
# If SOCKET points to a file, then this file is cleaned up by the init script.
#
# See spawn-fcgi(1) for all possible options.
#
# Example :
#SOCKET=/var/run/php-fcgi.sock
#OPTIONS="-u apache -g apache -s $SOCKET -S -M 0600 -C 32 -F 1 -P /var/run/spawn-fcgi.pid -- /usr/bin/php-cgi"

FCGI_SOCKET=/var/run/fcgiwrap.socket
FCGI_PROGRAM=/usr/local/sbin/fcgiwrap
FCGI_USER=nginx
FCGI_GROUP=nginx
FCGI_EXTRA_OPTIONS="-M 0700"
OPTIONS="-u $FCGI_USER -g $FCGI_GROUP -s $FCGI_SOCKET -S $FCGI_EXTRA_OPTIONS -F 1 -P /var/run/spawn-fcgi.pid -- $FCGI_PROGRAM"

啓動spawn-fcgi

chkconfig --levels 2345 spawn-fcgi on
chkconfig --levels 2345 php-fpm on
/etc/init.d/spawn-fcgi start
service php-fpm start


把spawn-fcgi設爲開機啓動,並啓動該服務,該服務成功啓動後會在:
/var/run目錄下生成一個fcgiwrap.socket文件。




安裝php5模塊


我這邊使用的是php-5.6.2,下載地址爲:
http://cn2.php.net/distributions/php-5.6.2.tar.gz
使用命令:

wget http://cn2.php.net/distributions/php-5.6.2.tar.gz


安裝libmcrypt

yum  install  php-mcrypt  libmcrypt  libmcrypt-devel

編譯和安裝php5

./configure --prefix=/usr/local/php --with-config-file-path=/usr/local/php/etc --enable-fpm
 --with-fpm-user=php-fpm --with-fpm-group=php-fpm --with-mysql=mysqlnd
 --with-mysql-sock=/var/lib/mysql/mysql.sock --with-libxml-dir --with-gd --with-jpeg-dir --with-png-dir
 --with-freetype-dir --with-iconv-dir --with-zlib-dir --with-mcrypt --enable-soap --enable-gd-native-ttf --enable-ftp --enable-mbstring --enable-exif --disable-ipv6 --with-pear --with-curl --with-openssl
Make && make install

測試php5與nginx的結合

編寫一個測試php文件爲test.php,內容以下:


<?php
   phpinfo();
?>

把它放於/var/www.php目錄內




配置nginx


server {
  	error_log logs/php.error.log;
    	access_log logs/php.access.log;
    	listen       82;
    	server_name  192.168.0.101;
    	root /var/www/php;
  	index index.php;
       location ~ .php$ {
    		gzip off;
   		#fastcgi_pass unix:/var/run/fcgiwrap.socket;
		fastcgi_pass   127.0.0.1:9000;		
		fastcgi_index index.php;
    		fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    		include fastcgi_params;
		fastcgi_connect_timeout 300;
		fastcgi_send_timeout 300;
		fastcgi_read_timeout 300;
        }
 	location = /favicon.ico {
        	log_not_found off;
        	access_log off;
   	} 
	location ~ /\.ht {
  		deny all;
 	}
	
    }


運行測試.php


咱們打開一個ie使用如:http://192.168.0.101:82/test.php來訪問咱們的測試頁,若是你獲得下面相似的界面,那就說明你的php已經和nginx結合成功了,若是你遇到下面這幾個錯誤,本文將給出解決方法(網上的基本都是不對的)。


Nginx在訪問時IE出現502 bad gateway錯誤解決方法

nginx出現502有不少緣由,但大部分緣由能夠歸結爲資源數量不夠用,也就是說後端php-fpm處理有問題,nginx將正確的客戶端請求發給了後端的php-fpm進程,可是由於php-fpm進程的問題致使不能正確解析php代碼,最終返回給了客戶端502錯誤。
服務器出現502的緣由是鏈接超時 咱們向服務器發送請求 因爲服務器當前連接太多,致使服務器方面沒法給於正常的響應,產生此類報錯
所以若是你服務器併發量很是大,那隻能先增長機器,而後按如下方式優化會取得更好效果;但若是你併發不大卻出現502,通常均可以歸結爲配置問題,腳本超時問題。


php-fpm進程數不夠用


使用 netstat -napo |grep "php-fpm" | wc -l 查看一下當前fastcgi進程個數,若是個數接近conf裏配置的上限,就須要調高進程數。
但也不能無休止調高,能夠根據服務器內存狀況,能夠把php-fpm子進程數調到100或以上,在4G內存的服務器上200就能夠。
咱們的php是安裝在/usr/local/php目錄下,更改/usr/local/php/php-fpm.conf文件,找到下面這一行。

pm.max_children = 10


也有可能這一行是被註釋掉的,把它放開後改動以下:
pm.max_children = 100


調高調高linux內核打開文件數量


echo 'ulimit -HSn 65536' >> /etc/profile
echo 'ulimit -HSn 65536' >> /etc/rc.local
source /etc/profile


腳本執行時間超時


若是腳本由於某種緣由長時間等待不返回 ,致使新來的請求不能獲得處理,能夠適當調小以下配置。
nginx.conf裏面主要是以下


fastcgi_connect_timeout 300;
fastcgi_send_timeout 300;
fastcgi_read_timeout 300;

php-fpm.conf裏如要是以下

request_terminate_timeout = 10s

緩存設置比較小
修改或增長配置到nginx.conf


proxy_buffer_size 64k;
proxy_buffers  512k;
proxy_busy_buffers_size 128k;


報ERROR: cannot get uid for user '@php_fpm_user@'錯


修改php的配製文件(此例咱們在/usr/local/php/etc/目錄下的php-fpm.conf文件)

user = php-fpm
group = php-fpm

在文件中加入上述兩行,同時在centos中加入相應的用戶和組重啓php-fpm服務便可。


安裝phpMyAdmin


我這邊使用的是phpMyAdmin-4.0.4.2-all-languages.zip。

注:
phpMyAdmin版本和mySql版本有對應關係,目前較高版的phpMyAdmin支持的是mySql5.x及以上版本。
由於我安裝的是mySQL5.1.x,所以我只能用phpMyAdmin4.0.x。
咱們把phpMyAdmin-4.0.4.2-all-languages.zip解壓後的內容所有copy進/var/www/php/目錄下的/myadmin目錄內。


配置config文件


把/var/www/php/myadmin目錄下的config.sample.inc.php文件copy成另外一份並命名成config.inc.php的文件並按照以下格式修改:


mysql主機信息


$cfg['Servers'][$i]['host'] 
$cfg['Servers'][$i]['port'] 
$cfg['Servers'][$i]['user'] 
$cfg['Servers'][$i]['password']


把這些值按照你須要管理的mysql的主機信息一一填寫完整,user和password你可使用mysql的root用戶信息。



認證方式




短語密碼(blowfish_secret)的設置

$cfg['blowfish_secret'] = ''; 
若是認證方法設置爲cookie,就須要設置短語密碼,置於設置爲何密碼,由您本身決定  ,可是不能留空,不然會在登陸phpmyadmin時提示錯誤,如:我設置的就是secret。


初始化phpMyAdmin


一切就緒後你可使用http://192.168.0.101:82/myadmin/這樣的網址登陸你的phpMyAdmin了,第一次登陸會要求你輸入「短語密碼」,咱們輸入事先配置好的secret,而後在用戶名和密碼處輸入你要管理的mysql實例的root用戶名和密碼便可以經過phpMyAdmin來管理你的mySQL實例了。




經過phpMyAdmin你能夠感覺到至關強大的圖形化mySQL管理功能。


mySQL 的批量操做-rewriteBatchedStatements參數


默認mySQL的驅動是不支持批量操做的即便用了addBatch


使用 jdbc的批量操做,就是PreparedStatement 類上的addBatch(),executeBatch()方法。 
在這裏要提醒一下你們,MySql的JDBC驅動,是不支持批量操做的,就算你在代碼中調用了批量操做的方法,MySql的JDBC驅動,也是按通常insert操做來處理的。 
一樣Fetch Size特性MySql的JDBC驅動也不支持。而Oracle的JDBC驅動是都支持的。 
若是你之前使用的是Mysql數據庫, 不要期望經過批處理來提升性能了。所以這纔有了rewriteBatchedStatements參數的用法。


mySQL的批量操做設置


MySql的JDBC鏈接的url中要加rewriteBatchedStatements參數,並保證5.1.13以上版本的驅動,才能實現高性能的批量插入。
例如: 


String connectionUrl="jdbc:mysql://192.168.1.100:3306/test?rewriteBatchedStatements=true" ; 

還要保證Mysql JDBC驅的版本相匹配。


Mysql JDBC驅動,各個版本測試結果




經過一個例子來做對比


Java核心代碼-非批量(非addBatch)


try {          
        PreparedStatement prest = conn.prepareStatement(sql);          
        long a=System.currentTimeMillis();    
        for(int x = 1; x <= count; x++){          
           prest.setInt(1, x);          
           prest.setString(2, "張三");          
           prest.execute();    
           if(x%point==0){  
               conn.commit();  
           }  
        }          
        long b=System.currentTimeMillis();    
        print("MySql非批量插入10萬條記錄",a,b,point);  
} catch (Exception ex) {    
      ex.printStackTrace();    
}finally{    
      close(conn);      
}    


Java核心代碼-批量(addBatch)


try {          
      PreparedStatement prest = conn.prepareStatement(sql);          
      long a=System.currentTimeMillis();    
      for(int x = 1; x <= count; x++){          
          prest.setInt(1, x);          
          prest.setString(2, "張三");          
          prest.addBatch();      
          if(x%point==0){  
              prest.executeBatch();        
              conn.commit();  
          }  
      }          
      long b=System.currentTimeMillis();    
      print("MySql批量插入10萬條記錄",a,b,point);  
} catch (Exception ex) {    
      ex.printStackTrace();    
}finally{    
      close(conn);      
}    


運行結果對比(插入10萬條記錄)


不加rewriteBatchedStatements的狀況下進行對比



這裏經過一個點也能夠看出來:

  • Mysql批量與非批量性能是同樣。
  • oracle的JDBC實現的批量操做的性能十分優秀。


給mySQL加上rewriteBatchedStatements的狀況下進行對比


String connectionUrl="jdbc:mysql://192.168.1.100:3306/test?rewriteBatchedStatements=true" ; 

筆者在使用mysql jdbc驅動5.1.13版的基礎上 加了rewriteBatchedStatements參數, 並配合使用addBatch方法,10萬條記錄的一次性插入速度提升到了1.6秒左右。
如下是使用了rewriteBatchedStatements後再配合使用addBatch的統計結果,供對比:


相關文章
相關標籤/搜索