使MySQL拥有NoSQL一般的性能。
大家都知道,NoSQL更容易水平扩展和集群管理,只需少量的人工干预。然后迁移到NoSQL需要付出昂贵的代价,数据需要重要组合,导入,代码也需要重新编写。但MySQL也有自己的优点,像支付事务等功能。因此我们需要正确的使用MySQL。
1). 使用正确的版本
Mysql在每个版本升级中都会有大的性能提升,因此通常情况下应该及时更新Mysql到最新版本。基准测试表明SSD硬盘上的I/O性能在5.5版本上比5.1高20%。
2). 使用Percona分支
速度比MySQL快40%
更稳定的性能
包含XtralDB, InnoDB分支,提供更多的可调谐性和更好的内存使用率
更多的参数选项,容易更好的控制。
3). Percona安装
yum install Percona-Server-client-56 Percona-Server-server-56
4). 是否应该进行数据分片?
在不熟悉你的数据的情况下,很难说清是否需要分片数据。但在大多数情况下使用Mysql进行数据分片是错误的,或许可以 使用其他的数据库来实现。众所周知,Mysql并不适合于数据分片,特别是集群管理。
5). 处理php连接mysql是的timeout问题
PHP5.3以前,PHP跟mysql的通信使用libmysql库。5.3时,PHP团队为php编写了专用库mysqlnd(Mysql Native Driver),它能更好的与PHP结合。例如我们可以使用PHP代码继承mysqlnd,添加查询日志,负载均衡,查询缓存待功能。
一个最大的缺点就是libmysql和mysqlnd都不支持连接超时时间和查询超时时间小于1秒,也就是说如果mysql服务不可用时,最小的timeout时间为1秒,在高负载的服务器上是不可接受的。
(1). 使用PDO设置超时时间
$pdo=newPDO("mysql:host=localhost;dbname=test","username","password");
$pdo->setAttribute(PDO::ATTR_TIMEOUT,1);
(2). 使用mysqli设置超时时间
$mysqli=mysqli_init(); //不能使用$mysqli = new mysqli('localhost'),否则无法设置超时时间
$mysqli->options(MYSQLI_OPT_CONNECT_TIMEOUT,1);
$mysqli->real_connect("localhost","username","password","test");
6). 关于超时
如果不设置Mysql超时时间,遇到慢的SQL查询时,PHP-FPM会一直堵塞,直到超过最大执行时间(max_execute_time)。即使PHP-FPM进程被强制结束,查询仍然会在Mysql中执行。
7). 使用HAProxy设置超时时间
使用HAProxy做为Mysql的负载均衡时,它允许设置TCP超时时间,可以设置连接、查询时间到微秒级别。
timeout connect 500ms //连接后端服务器的超时时间
timeout client 1000ms //haproxy发送数据给后端服务器时超时时间
timeout server 1000ms //haproxy等待服务器响应时超时时间
8). 使用Percona工具集中的pt-kill杀掉长时间执行的查询。
(1). 安装
(2). 使用
pt-kill --daemonize --kill --busy-time 60s --match-user webuser
9). php、mysql是否应该使用长链接
php5.4基准测试显示,使用持久链接比非持久链接快20%-25%,每个请求大概快20ms。
优点:无需每个请求创建mysql连接
缺点:
1). 缺少重置连接机制,未提交的事务可能被下一个PHP-FPM进程提交。mysqli可以每次重用时调用mysql_change_user()重置。
2). 在连接上设置的mysql变量会被下一个进程使用。 需要为每个PHP-FPM进程分配一个连接。总连接数 =pm.max_children * server num