连接完成之后,如果没有后续的操作,这个连接就处于空闲状态,可以通过 show processlist 查看当前空闲的连接。长时间不操作,连接器会主动断开,默认8小时。可以通过参数wait_timeout去控制。已被断开的连接,如果客户端再次发起哀求的时间会提示Lost connection to MySQL server during query。只有重连才可以再次执行哀求。
数据库中长连接是指连接之后,客户端持续哀求利用同一个连接;短连接则是每次执行完很少的反复哀求就断开连接,下次再从新建立一个连接。但是如果全部是用长连接的话,Mysql的内存就涨的特别快。mysql执行过程中临时用的内存是管理在连接对象内里的。只有断开连接的时间才能释放。长期这样操作就会出现OOM。Mysql异常重启。
解决方案1:定期断开长连接。利用一段时间,大概步伐内里判定执行过一个占用内存的大查询后,断开连接,之后要查询再重连。
解决方案2:如果你用的是 MySQL 5.7 或更新版本,可以在每次执行一个比较大的操作后,通过执行 mysql_reset_connection 来重新初始化连接资源。这个过程不需要重连和重新做权限验证,但是会将连接规复到刚刚创建完时的状态。
查询缓存
mysql首先会进行语法分析。语法分析器根据语法规则判定输入的sql是否满足Mysql的语法。如果不满足会收到You have an error in your SQL syntax的错误提示。一样平常语法错误会提示第一个出现错误的位置,所以你要关注的是紧接“use near”的内容。
在此也会校验表是否存在,字段是否存在等。
优化器
平常的lru算法:末尾镌汰法,新数据从链表头部加入,释放空间时从末尾镌汰
改进的lru算法:链表分为new和old两个部门,加入元素不是重新部开始的,是从中间midpint位置插入,如果数据很快被访问,那么page就会向new列表头部移动,如果数据没有被访问,会逐步向old尾部移动,等待镌汰。
每当有新的page读取到Buffer Pool时,InnoDB引擎会判定是否有空闲页,是否足够,如果有就将free page从free list删除,放入lru列表中。没有空闲页就会根据lru算法进行镌汰。
Buffer Pool 配置参数
show variables like '%innodb_page_size%' //查看page页大小
show variables like '%innodb_old%' //查看lru list 列表参数
show variables like '%innodb_buffer%' //查看Buffer Pool参数
建议:将innodb_buffer_pool_size设置为总内存的60%-80%,innodb_buffer_pool_instances可以设置为多个,这样制止缓存争取。
Change Buffer
错误日记(Erroe log):默认是开启的。show variables like '%log_error%';
通用查询日记(General query log):纪录一样平常查询语句,show variables like '%general%';
二进制文件(binary log):纪录对Mysql数据库执行的更改操作,而且纪录语句的发生时间,执行时长;但是不纪录select、show等不修改数据库的sql,重要用具数据库的规复和主从复制。show variables like '%log_bin%';//是否开启 show variables like '%binlog%';//参数参看 show binary logs;//查看日记文件
慢查询日记(slow query log):纪录所有执行超时的查询sql,默认10秒show variables like '%show_query%';//是否开启 show variables like '%long_query_time%';//时长