Mysql45讲-心得01

一 select语句的执行流程
1)先链接mysql,校验权限
2)查询缓存,有则返回,无则继续执行
3)执行分析器进行语法分析,分析出要查询那些表,那些列,再执行语义分析,看sql语句是否有问题。
4)执行优化器,如选用那个索引进行查询
5)执行操作引擎,进行实际操作
二 redolog和binlog

Mysql45讲-心得01_第1张图片
重点理解 :
redolog是为了解决刷新脏页数据的,每次行数据更新后都直接flush到disk的话,这样IO成本太高了,直接把这些修改写入到redolog中,这样等Mysql空闲下来的时候再刷新脏页,同时这样也保证了数据库拥有crash-safe的能力。

binglog是为了实现数据归档而存在,记录的数据的逻辑操作,记录的格式一般有以下3个
1)statement sql语句 但是可能造成数据不一致,如调用了uuid或者time函数
2)row 记录行的变化,缺点就是在内存可能会存在较大的容量,然后IO开销大。
3)mixed 当有记录行可能发生变化的话就用row,否则就用mixed

将redo log的写入拆成了两个步骤:prepare和commit
写入redo_log后阶段是prepare阶段,然后写入binlog日志,最后提交事务。

开启slow_query_log
编辑 my.cnf
slow_query_log=1
slow_query_log_file=/usr/local/mysql/data/slow-query.log
long_query_time=1 # 慢查询日志的时间定义(秒),默认为10秒,多久就算慢查询的日志
log_queries_not_using_indexes=1 # 将所有没有使用带索引的查询语句全部写到慢查询日志中

PS
数据库里面,长连接是指连接成功后,如果客户端持续有请求,则一直使用同一个连接。短连接则是指每次执行完很少的几次查询就断开连接,下次查询再重新建立一个。
建立连接的过程通常是比较复杂的,所以我建议你在使用中要尽量减少建立连接的动作,也就是尽量使用长连接。
但是全部使用长连接后,你可能会发现,有些时候MySQL占用内存涨得特别快,这是因为MySQL在执行过程中临时使用的内存是管理在连接对象里面的。这些资源会在连接断开的时候才释放。所以如果长连接累积下来,可能导致内存占用太大,被系统强行杀掉(OOM),从现象看就是MySQL异常重启了。
怎么解决这个问题呢?你可以考虑以下两种方案。
1)定期断开长连接。使用一段时间,或者程序里面判断执行过一个占用内存的大查询后,断开连接,之后要查询再重连。
2)如果你用的是MySQL 5.7或更新版本,可以在每次执行一个比较大的操作后,通过执行 mysql_reset_connection来重新初始化连接资源。这个过程不需要重连和重新做权限验证,但是会将连接恢复到刚刚创建完时的状态。
连接时间可以由wait_timeout控制,默认是8小时

你可能感兴趣的:(Mysql45讲心得)