MySql查询过程
1.首先到达连接器,连接器负责跟客户端建立连接、获取权限、维持和管理连接
2.到达分析器,分析器就是对查询SQL语句进行解析,校验语法是否正确.
3.优化器,在了解了SQL语句需要做什么后,当表里面存在多个索引会选择最佳的索引进行查询。
4.执行器,在清楚SQL语句需要做什么并且怎么做的时候,还会再判断一下用户有没有这个表的查询权限,如果有的话执行器会根据表的引擎去寻转引擎对应的接口去执行。
MySql更新过程
数据更新与查询流程不一样的是,更新流程还涉及两个重要的日志模块,分别是redo log(重做日志)和binlog(归档日志)。
redolog:如果每一次更新操作都写进磁盘,磁盘去寻找相应的记录并修改耗费IO成本,redolog的做法是先将更新操作写进日志中,在磁盘空闲的时候再写进磁盘。InnoDB的redo log是固定大小的,
会存在write pos和check point指针,write pos是当前记录的位置,checkpoint是当前要擦出的位置,在写入数据的时候write pos会不断往后移,在写进磁盘的时候checkpoint的指针会往后移,write pos和checkpoint之间空余的部分就是空闲部分,如果write pos和checkpoint相等则表示写入日志已经满了,必须先读部分数据进入磁盘。 (redo log是InnoDB特有的日志)
binlog:binlog的存在是因为redo log是InnoDB特有的日志,MySQL从整体上看分为两层,一层为Server层,另一层为引擎层.binlog就存在于Server层.redolog是循环写的,binlog是追加写的并不会覆盖以前的日志.
redolog和binlog两阶段提交:
索引
在InnoDB中,表都是根据逐渐顺序以索引的形式存放的,这种方式称为索引组织表,InnoDB使用了B+树索引模型。
主键索引和普通索引的区别:主键索引保存的是整行的数据,普通索引存放的是主键ID,所以查询整行数据的时候最好通过主键去查比较快,如果使用普通索引则先会查找主键的值,再通过主键的值查找整行数据.因为普通索引存储的是主键的值,所以当主键的值设计的越小的时候普通索引则越小,这也是部分列不直接当主键索引的原因.当只需通过普通索引查询主键的时候尽量不要去查找整行记录,以减少回表次数(回到主键索引树的过程称为回表)
自增主键的好处是每插入一条新数据都是追加操作,不挪动其他数据,也不会出发叶子节点的分裂.
最左前缀可以是联合索引最左N个字段,也可以是字符串索引的最左M个字符,就可以利用该索引加快检索.例如有(a,b)索引的时候就不需要为a单独建立一个索引
锁
全局锁: 命令是:Flush tables with read lock(FTWRL),让整个库处于只读状态,典型场景:全局备份。
表级锁:表锁和元数据锁