mysql学习笔记一
1. sql执行流程
2. 创建表时的存储引擎大部分时候最好使用InnoDB,mysql 5.5.5开始默认的存储引擎改为了innodb。
3.查询缓存会缓存sql语句的查询结果,但是在数据更新时,缓存立即被清空,所以除非表数据很少的更新的情况,一般建议关闭查询缓存。 打开my.ini 设置query_cache_type=0来关闭查询缓存。 mysql还提供了一种按需缓存的方式。设置query_cache_type=DEMAND,查询语句使用select SQL_CACHE * from table;
4.分析器会分析查询语句,标记每个单词的作用,以及判断sql语句是否满足mysql语法,否则就会报错,一般我们只要关注 use near后面的错误内容。
5.优化器决定了使用哪个索引以及多表关联时各表的连接顺序
6.执行器会判断用户的权限,没有权限则报错
7.mysql server层有一个归档日志bin log,bin log是一个逻辑日志,而innodb拥有一个属于自己的重做日志redo log,redo log是一个物理日志。再一条语句更新时,bin log和redo log是做为一个事务一起提交的,否则当两步提交中有一步失败的情况下使用bin log备份恢复数据时,会操作恢复数据和实际数据有差异的情况
8.redo log类似一个消息队列,每次更新将更新信息写入这个消息队列,然后等到一定程度,将信息一次性写入磁盘,这样比每次更新立即写入磁盘减少了IO成本。redo log的大小是固定的,mysql维护了两个指针,从头往后移动,一个写指针,一个删指针,当写指针移动到尾部时,会回到头部重新开始,写指针到删指针的部分就是需要更新的内容,当写指针追上删指针时,说明redo log写满了,此时需要先更新掉一部分数据,再开始写。由于redo log是一个物理日志,所以可以实现mysql的crash-safe。在数据库崩溃时,不会丢失更新数据,只要数据库重启时,再将redo log的内容写入磁盘就行了,这也实现了数据库的无阻塞备份。在实际使用中,建议设置innodb_flush_log_at_trx_commit=1,即每次事务的redo log都持久化到磁盘,来防止mysql异常重启导致的数据丢失。
9.bin log时mysql server层实现的一个逻辑日志,它记录了数据库的所有逻辑操作,如果需要回复数据库到某一时刻,只需要先找到最近的一次全量备份,然后取出从全量备份的时间点开始bin log,重新放到要回复的时刻。在实际使用中,建议设置sync_binlog=1,即每次事务的bin log都持久化到磁盘,来防止mysql异常重启后导致的binlog丢失。