MySQL系列教程(四)
文件打开数(open_files)
我们现在处理MySQL故障时,发现当Open_files大于open_files_limit值时,MySQL数据库就会发生卡住的现象,导致Nginx服务器打不开相应页面。这个问题大家在工作中应注意,我们可以用如下命令查看其具体情况:
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%
InnoDB_buffer_pool_cache合理设置
InnoDB存储引擎的缓存机制和MyISAM的最大区别就在于,InnoDB不仅仅缓存索引,同时还会缓存实际的数据。此参数用来设置InnoDB最主要的Buffer的大小,也就是缓存用户表及索引数据的最主要缓存空间,对InnoDB整体性能影响也最大。
无论是MySQL官方手册还是网络上许多人分享的InnoDB优化建议,都是简单地建议将此值设置为整个系统物理内存的50%~80%。这种做法其实不妥,我们应根据实际的运行场景来正确设置此项参数。
很多时候我们会发现,通过参数设置进行性能优化所带来的性能提升,并不如许多人想象的那样会产生质的飞跃,除非是之前的设置存在严重不合理的情况。我们不能将性能调优完全依托与通过DBA在数据库上线后进行参数调整,而应该在系统设计和开发阶段就尽可能减少性能问题。(重点在于前期架构合理的设计及开发的程序合理)。
MYSQL监控管理工具介绍
MySQL越来越被更多企业接受,随着企业发展,MySQL存储数据日益膨胀,MySQL的性能分析、监控预警、容量扩展议题越来越多。“工欲善其事,必先利其器”,那么我们如何在进行MySQL性能分析、监控预警、容量扩展问题上得到更好的解决方案,就要利用各种工具来对MySQL各种指标进行分析。本文是读书笔记,下面提及的工具,读者可能都用过,或打算准备是使用。
MySQL服务器的发布包没有包含那些能完成许多常见任务的工具,例如监控服务器的工具、比较服务器间数据的工具。我们把这些工具分成以下几类:界面、监控、分析和辅助工具。
带界面的工具
1、MySQL可视化工具
这些工具都可以免费使用:
a、MySQL查询浏览器(MySQL Query Browser):这个不用说了…
b、MySQL管理员(MySQL Administrator):功能集中在服务器管理上,所以它最适合DBA使用,而不是开发人员和分析人员。它可以帮助DBA把创建备份 、创建用户并分配权限、显示服务器日志和状态信息等过程进行自动化处理。它还包括了一些基本的监控功能,例如图形化的状态变量显示,但是它没有下文里会提到的交互式监控工具那么灵活。
c、MySQL迁移工具箱(MySQL Migration Tookit):可以帮你把数据从别的数据库系统迁移到MySQL里。
d、MySQL工作台(MySQL Workbench):MySQL的建模工具。
2、SQLyog
SQLyog是最常用的MySQL可视化工具,只能用于win下。
3、phpMyAdmin
phpMyAdmin是一款很流行的管理工具,它基于Web界面来管理MySQL服务器。有很多支持者,但反对者也不少。
监控工具
MySQL监控是一个很大复杂的任务,不同的应用有着不同的需求。“监控”是大家滥用的术语之一,承载了几重意思。我们讲到的监控工具被分为非互动的和互动的两类。非互动监控常常就是一个自动化系统,它接收系统的测量值,如果有超出安全范围的,就通过发出警告提醒管理员。互动监控工具可以让你实时地观测服务器。
你可能对监控工具在其他方面的差别也很感兴趣,例如被动监控和主动监控,后者会发送报警信息并作出初步反应(就像Nagios一样);或者你可能正在寻找这样一工具:它可以创建一个信息仓库,而不仅仅是显示当前的统计信息。有许多监控系统不是专为监控MySQL而设计的,它们就是一个通用系统,里面设计了一个周期性的任务,定时去检查各类资源的状态,例如像服务器、路由器、以及各种软件(包括MySQL)。它们常常会提供一个插件架构,同时有一个预订的MySQL插件可供使用。这样的一些系统能够记录监控对象的状态,并通过web界面用图形化的形式表示出来。当监控对象出现问题,或者状态值超过安全范围时,它们还能发送报警信息,或者执行一个初始化的动作。
非交互性工具
Nagios
监控界流行一句话:只要用顺了Nagios,你就永远不会再想到其它监控系统。
对于Nagios本blog会持续推出相关文章,现在只是引用Nagios官方的介绍:
Nagios是一款用于系统和网络监控的应用程序。它可以在你设定的条件下对主机和服务进行监控,在状态变差和变好的时候给出告警信息。
Nagios最初被设计为在Linux系统之上运行,然而它同样可以在类Unix的系统之上运行。
Nagios更进一步的特征包括:监控网络服务(SMTP、POP3、HTTP、NNTP、PING等);
监控主机资源(处理器负荷、磁盘利用率等);
简单地插件设计使得用户可以方便地扩展自己服务的检测方法;
并行服务检查机制;
具备定义网络分层结构的能力,用”parent”主机定义来表达网络主机间的关系,这种关系可被用来发现和明晰主机宕机或不可达状态;
当服务或主机问题产生与解决时将告警发送给联系人(通过EMail、短信、用户定义方式);
具备定义事件句柄功能,它可以在主机或服务的事件发生时获取更多问题定位;
自动的日志回滚;可以支持并实现对主机的冗余监控;可选的WEB界面用于查看当前的网络状态、通知和故障历史、日志文件等;
下面是可代替Nagios的工具:
Zenoss
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 工具(这个很出名,可惜已停止更新)
1、Mysqlreport
2、Mysqlsla
3、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的统计结果,供对比:
MySQL系列教程(四)的更多相关文章
- MySQL 系列(四)主从复制、备份恢复方案生产环境实战
第一篇:MySQL 系列(一) 生产标准线上环境安装配置案例及棘手问题解决 第二篇:MySQL 系列(二) 你不知道的数据库操作 第三篇:MySQL 系列(三)你不知道的 视图.触发器.存储过程.函数 ...
- CRL快速开发框架系列教程四(删除数据)
本系列目录 CRL快速开发框架系列教程一(Code First数据表不需再关心) CRL快速开发框架系列教程二(基于Lambda表达式查询) CRL快速开发框架系列教程三(更新数据) CRL快速开发框 ...
- C#微信公众号开发系列教程四(接收普通消息)
微信公众号开发系列教程一(调试环境部署) 微信公众号开发系列教程一(调试环境部署续:vs远程调试) C#微信公众号开发系列教程二(新手接入指南) C#微信公众号开发系列教程三(消息体签名及加解密) C ...
- Android Studio系列教程四--Gradle基础
Android Studio系列教程四--Gradle基础 2014 年 12 月 18 日 DevTools 本文为个人原创,欢迎转载,但请务必在明显位置注明出处!http://stormzhang ...
- NGUI系列教程四(自定义Atlas,Font)
今天我们来看一下怎么自定义NGUIAtlas,制作属于自己风格的UI.第一部分:自定义 Atlas1 . 首先我们要准备一些图标素材,也就是我们的UI素材,将其导入到unity工程中.2. 全选我们需 ...
- 屌炸天实战 MySQL 系列教程(二) 史上最屌、你不知道的数据库操作
此篇写MySQL中最基础,也是最重要的操作! 第一篇:屌炸天实战 MySQL 系列教程(一) 生产标准线上环境安装配置案例及棘手问题解决 第二篇:屌炸天实战 MySQL 系列教程(二) 史上最屌.你不 ...
- 黄聪:Microsoft Enterprise Library 5.0 系列教程(四) Logging Application Block
原文:黄聪:Microsoft Enterprise Library 5.0 系列教程(四) Logging Application Block 企业库日志应用程序模块工作原理图: 从上图我们可以 ...
- Fastify 系列教程四 (求对象、响应对象和插件)
Fastify 系列教程: Fastify 系列教程一 (路由和日志) Fastify 系列教程二 (中间件.钩子函数和装饰器) Fastify 系列教程三 (验证.序列化和生命周期) Fastify ...
- webpack4 系列教程(四): 单页面解决方案--代码分割和懒加载
本节课讲解webpack4打包单页应用过程中的代码分割和代码懒加载.不同于多页面应用的提取公共代码,单页面的代码分割和懒加载不是通过webpack配置来实现的,而是通过webpack的写法和内置函数实 ...
- Influx Sql系列教程四:series/point/tag/field
influxdb中的一条记录point,主要可以分为三类,必须存在的time(时间),string类型的tag,以及其他成员field:而series则是一个measurement中保存策略和tag集 ...
随机推荐
- [转]最常用的15大Eclipse开发快捷键技巧
作者:Java我人生(陈磊兴) 原文出处http://blog.csdn.net/chenleixing/article/details/44600587 做Java开发的,经常会用Eclipse ...
- scrapy爬取西刺网站ip
# scrapy爬取西刺网站ip # -*- coding: utf-8 -*- import scrapy from xici.items import XiciItem class Xicispi ...
- 从源码看JDK提供的线程池(ThreadPoolExecutor)
一丶什么是线程池 (1)博主在听到线程池三个字的时候第一个想法就是数据库连接池,回忆一下,我们在学JavaWeb的时候怎么理解数据库连接池的,数据库创建连接和关闭连接是一个比较耗费资源的事情,对于那些 ...
- Spring AOP异常捕获原理
Spring AOP异常捕获原理: 被拦截的方法,须显式的抛出异常,且不能做任何处理, 这样AOP才能捕获到方法中的异常,进而进行回滚. 换句话说,就是在Service层的 ...
- Javascript中获取浏览器类型和操作系统版本等客户端信息常用代码
/** * @author hechen */ var gs = { /**获得屏幕宽度**/ ScreenWidth: function () { return window.screen.widt ...
- 安装 WordPress 时一些常见问题
1)安装 WordPress 时,输入数据库信息后提交之后,却直接弹出一个空白页面 解决方法很简单,打开PHP的配置文件php.ini,查找max_execution_time,将这个参数改为max_ ...
- position的static、relative、absolute、fixed、inherit
网上有很多关于position的讲解,也有很多他们属性之间的比较,但是比较全面的讲解还是比较少,每次看完过段时间就忘了,所以今天参考了很多网上现有的资源,自己整理一下,写下这篇文章. position ...
- 幸运序列(lucky)
[问题描述] Lsy喜欢幸运数字,众所周知,幸运数字就是数字位上只有4和7的数字. 但是本题的幸运序列和幸运数字完全没关系,就是一个非常非常普通的序列.哈哈,是不是感觉被耍了,没错,你就是被耍了. L ...
- 【BZOJ1060】【ZJOI2007】时态同步
Description 小Q在电子工艺实习课上学习焊接电路板.一块电路板由若干个元件组成,我们不妨称之为节点,并将其用数字1,2,3-.进行标号.电路板的各个节点由若干不相交的导线相连接,且对于电路板 ...
- 习题9-8 Uva1632
题意: 给你n个宝藏,然后给出他们的位置a[i]以及存在时间tim[i],如果能全部拿完,求出最短时间: 否则输出No solution 思路: 对于一段区间[i,j],你取完之后肯定是在最左端或者最 ...