以前在上一家公司的时候,没有使用过MySQL,都是使用的SQL Server,虽然同样有作过数据库存储过程的优化,可是对于底层实现,内部原理是没有了解的,因此决定系统性的学习下MySQL,而且记录下学习过程当中遇到的问题和一些心得体会,但愿你们可以一块儿探讨,帮忙斧正。mysql
主要的学习资料:sql
1.链接器
链接器负责经过端口ip 端口号port 用户名user和密码pwd来链接到对应的server上
命令行中命令以下
mysql -h[ip] -**P**[port] -u[user] -p([pwd])
本地访问ip&port都可省略 最好使用将密码单独key入的形式防止泄露数据库
链接也分为长链接和短链接,推荐使用长链接
复制代码
2.查询缓存
经常使用于表数据不怎么发生变化的配置表中,表上有更新时,就会所有清空该表上的缓存 在mysql 8.0以后的版本中已经删除
在以前的版本可使用, 设置query_cache_type -> DEMAND缓存
mysql> select SQL_CACHE * FROM T WHERE ...
复制代码
3.分析器
根据输入进行词法分析 完成语法规则的修正 当发现错误时,通常会在第一处错误的地点抛出bash
You hava an error in your SQL syntax..
复制代码
4.优化器
决定使用哪条索引,以及 表联join的顺序 5.执行器 判断是否有执行权限 而后向存储引擎发起请求,最终返回结果给到客户端
当执行的是更新(插入/删除)语句的时候
将更新操做分别写入redolog和binlog用于备份
redolog 是由存储引擎层产生 环形数据结构,大小固定
binlog 由Server层产生,数据大小可追加写入
引擎层写入redolog后,redolog处于prepare状态,Server层生成该操做的binlog写入磁盘后,将这条redolog更新为commit状态,更新才完成,以这样的两阶段提交来保证两份日志之间的逻辑数据一致数据结构
ACID(Atomicity、Consistency、Isolation、Durability,即原子性、一致性、隔离性、持久性)
原子性保证该事务要么所有完成,要么所有不完成
一致性保证在事务开始以前到结束以后,数据库的完整性约束没有被破坏
隔离性保证每一个事务对其余事务的操做是能够分离的,不依赖于其余事务
持久性保证一旦提交,其结果是永久性的 同时存在不一样的隔离级别 包括1.读未提交,2.读提交,3.可重复读,4.串行化性能
索引是为了提供查询数据的效率学习
MySQL默认采用的是B+树(多叉树) 每一个索引即对应的一颗B+树,主键索引的叶子节点存储的是整行数据,而非主键索引的叶子节点内容则是主键值。因此常用主键索引来减小查询树的次数。 由于B+树的有序性致使,每次在插入新row是须要对索引进行必要的维护,因此更为推荐有序的自增索引做为主键,而少使用业务主键。优化
最左前缀原则--能够是联合索引的最左N个字段,也能够是字符串索引的最左M个字符 若是能够经过调整顺序而少创建一个索引,那这个顺序每每须要优先考虑。同时当联合索引又都有单独各自查询时,则考虑上空间的因素更为一般。spa