MySQL学习笔记 初学基础篇

479 阅读3分钟

之前在上一家公司的时候,没有使用过MySQL,都是使用的SQL Server,虽然一样有做过数据库存储过程的优化,但是对于底层实现,内部原理是没有了解的,所以决定系统性的学习下MySQL,并且记录下学习过程中遇到的问题和一些心得体会,希望大家能够一起探讨,帮忙斧正。

主要的学习资料:

  • MySQL实战45讲(GeekTime)
  • 高性能MySQL(第三版)
  • MySQL官方文档
  • 具体其他的资料大家也可以参考掘金小册中的MySQL运行最后一篇文章中找到更为详细的资料

MySQL Server端执行语句经历的几个过程(Base on InnoDB

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.分析器
根据输入进行词法分析 完成语法规则的修正 当发现错误时,一般会在第一处错误的地点抛出

You hava an error in your SQL syntax..

4.优化器
决定使用哪条索引,以及 表联join的顺序 5.执行器 判断是否有执行权限 然后向存储引擎发起请求,最终返回结果给到客户端
当执行的是更新(插入/删除)语句的时候
将更新操作分别写入redolog和binlog用于备份
redolog 是由存储引擎层产生 环形数据结构,大小固定
binlog 由Server层产生,数据大小可追加写入
引擎层写入redolog后,redolog处于prepare状态,Server层生成该操作的binlog写入磁盘后,将这条redolog更新为commit状态,更新才完成,以这样的两阶段提交来保证两份日志之间的逻辑数据一致

事务 Transation

ACID(Atomicity、Consistency、Isolation、Durability,即原子性、一致性、隔离性、持久性)
原子性保证该事务要么全部完成,要么全部不完成
一致性保证在事务开始之前到结束之后,数据库的完整性约束没有被破坏
隔离性保证每个事务对其他事务的操作是可以分离的,不依赖于其他事务
持久性保证一旦提交,其结果是永久性的 同时存在不同的隔离级别 包括1.读未提交,2.读提交,3.可重复读,4.串行化

索引 Index

索引是为了提供查询数据的效率

MySQL默认采用的是B+树(多叉树) 每个索引即对应的一颗B+树,主键索引的叶子节点存储的是整行数据,而非主键索引的叶子节点内容则是主键值。所以经常使用主键索引来减少查询树的次数。 因为B+树的有序性导致,每次在插入新row是需要对索引进行必要的维护,所以更为推荐有序的自增索引作为主键,而少使用业务主键。

覆盖索引

最左前缀原则--可以是联合索引的最左N个字段,也可以是字符串索引的最左M个字符 如果可以通过调整顺序而少建立一个索引,那这个顺序往往需要优先考虑。同时当联合索引又都有单独各自查询时,则考虑上空间的因素更为通常。