解决Mysql "Too many connections"问题

解决Mysql "Too many connections"问题

之前在博客介绍过一篇mysql锁机制相关文章,MYISAM只支持表锁;INNODB可以支持表锁和行锁。

最近公司平台频繁出现"Too many connections",真的让我受了很多伤啊,原因就是表锁引起SQL堵塞,影响效率,造成连接数达到max_connections而崩溃。说说我的解决流程。

(1)检查mysql配置的两个参数max_connections最大连接数和 wait_timeout连接空闲等待时长,如果是默认值,请自行修改:

set global max_connections=3000;

set global wait_timeout=10;

(2)检查mysql慢查询日志

1)发现一条 sql如下结构: select count(*) from table where ..., 我的业务表示INNODB,查阅资料发现,select count(*) from table,MyISAM只要简单的读出保存好的行数,而InnoDb会扫描所有的行数;但当该sql包含where时,两者都会对全表扫描,当然where后是索引会快的多。如果表的数据确实很大,比如我,就做了cache处理

2)慢查询中出现了table level lock,但是表的Innodb引擎。怎么回事?InnoDB 是行级锁,原则上,更新操作只会锁住需要修改的行。如果读和写是相同的行,会阻塞;如果是不同的行,可以并发操作。不过InnoDB的行锁是通过索引实现的,如果检索条件没有索引,则会使用表锁。