mysql
David_lou
这个作者很懒,什么都没留下…
展开
-
《mysql》10-为什么mysql会“抖”一下?
之前的章节,我们总结过mysql执行语句的一个机制,WAL(write-ahead-logging)。即,执行引擎为了能保证写入的速度,会在内存中存有一个小黑板-redolog,把执行的结果集写入redolog,当前结果集是prepared状态,然后执行器会把逻辑操作语句写到执行器的日志-binlog。然后调用执行器的commit语句,修改redolog的状态为commit。这个过程就是我们的两阶段提交过程。那么在写完redolog之后,其实磁盘上的数据就不太准确了,这个时候,磁盘上的记录就可以被当作“原创 2020-10-10 09:42:47 · 117 阅读 · 0 评论 -
《mysql》9-mysql为什么会“选错”索引
mysql执行查询语句的时候,按照我们之前梳理的执行顺序,首先是连接器, 查询缓存,命中之后返回 分析器,分析语法是否正确 优化器,优化执行语句,选择索引 执行器,执行器校验权限等。 执行引擎,具体的引擎只有到了5这一步,才会真正的执行查询语句,这个过程非常的有意思,我们在第四步优化器的时候会选择当前查询语句依赖的索引。比如sql语句:select a.name,a.age,a.address from table_a a where a.name like 'zhang%' and原创 2020-10-09 16:10:57 · 193 阅读 · 0 评论 -
《mysql》8-索引
索引是个好东西,从诞生就闪耀着智慧的光芒。索引的数据结构可以是hash表,有序数组,B树,B+数。mysql中如果数据库引擎是innodbhash表hash表其实跟HashMap是一样的数据结构,我们可以根据索引值的hash找到桶的位置,然后添加到桶对应的链表中。缺点是,hash表对区间查询不兼容,因为桶的列表是无序的,对应的链表是无序的,那么查找【k,k+1】的数据就需要遍历整个数据结构。所以hash表对等值查询的场景,比如Memcached或其他nosql引擎有序数组在《数据结构和算法》章节原创 2020-09-30 09:58:34 · 135 阅读 · 0 评论 -
《mysql基础》第1集 mysql的结构及查询语句的执行顺序
mysql的基本组成部分1.连接器:负责处理客户端的链接/请求2.分析器:词法分析/语法分析/判断语句是否正确3.优化器:优化执行语句,选择连接方式/索引4.执行器:操作引擎,返回结果5.存储引擎:存储数据,提供操作接口上面的五个部分就是mysql的基本组成部分。一般1-4是Server层。5是单独的存储引擎。因为存储引擎会有多种实现方案,比如innodb,memory等。一条查询语句的执行顺序1:连接器接受到链接,长链接-短链接。长链接的缓存会慢慢累加,所以注意长链接的原创 2020-05-27 09:16:16 · 172 阅读 · 0 评论 -
《mysql基础》第2集-修改语句的执行顺序
上一节《查询语句的执行顺序》总体梳理了一下mysql中查询语句的执行顺序,这次梳理一下mysql的修改语句的执行顺序其实修改语句的执行顺序跟查询语句的顺序一样,1:连接器-处理链接,验证权限2:查询缓存-缓存失效,所以不建议在修改频繁的表上用查询缓存3:分析器-词法分析,语法分析,验证否和mysql的标准4:优化器-选择用那个id查询符合条件的数据6:执行器-校验表权限,调用执行引擎,返回结果mysql的server层有binLoginnoDB的执行引擎有redoLogl原创 2020-05-27 21:13:14 · 194 阅读 · 0 评论 -
《mysql基础》第3集-redoLog-binLog的比较
上面总结了Mysql执行修改语句的过程,通过连接器-查询缓存-分析器-优化器-执行器-执行引擎几个部分。也讲了修改语句的两阶段提交,1-执行器把结果集写入执行引擎,2-执行引擎把结果集写入内存,并登记redoLog,此时redoLog的状态是prepare,告诉执行器可以随时提交事物。3-执行器把操作写入binLog,4-执行器调用执行引擎,提交事物,把redoLog的状态改为commit所以说,为什么要写两个日志,为什么要两个阶段提交。首先比较一下redoLog和binLog的原创 2020-05-27 21:35:11 · 131 阅读 · 0 评论 -
《mysql基础》4-隔离级别
mysql的InnoDB引擎支持事物,那么事物之间也有可见性的问题,当我们开启事物-提交事物的时候,我们想保证ACID属性,A 原子性C 一致性I 隔离性D 持久性隔离性的主要指标就是隔离级别,即事物之间的可见性的管控隔离级别的分类1-读未提交:A事物可以读取B事物未提交的变更,如B set a=3;A: read a,a=3;2-读提交: A事物可以读取B事物已经提交的变更3-可重复读 :A事物完成之前,读取的数据不会因为B事物的提交而变化4-串行化:A事物执行完.原创 2020-05-28 15:54:44 · 180 阅读 · 0 评论 -
《mysql基础》5-索引
数据库索引类型的类型有以下几种key-value类型:类似于HashMap,对于等值查询场景友好有序数组类型:有序数组能保证二分查找的速度,但是对于频繁修改数据的场景不太友好,对于静态表友好B树:树结构在查找性能上和修改性能上都能得到很好的平衡,所以很多数据引擎都是用B树索引现在InnoDB的索引模型是B+树B+树的物理模型就是,所有的数据都存储在叶子节点,并且保持平衡,叶子节点保存的是一段数据,数据是有序数组,这样数据的查找既可以用到树的查找速度,也可以用到有序数组的查找速度。In原创 2020-05-29 13:56:31 · 176 阅读 · 0 评论 -
《mysql基础》5-索引2
上一节索引部分简单总结了一下索引的数据结构,这一节总结一下索引的使用.上一节我们讲到二级索引保存的数据是主键,然后通过主键查询数据信息,这样的操作简称回表。例子create table T(ID int primary key,k int not null default 0,s varchar(20) not null default '',index k(k)engine = InnoDB)当我们查询语句 select ID from T where k >原创 2020-06-01 15:36:27 · 198 阅读 · 0 评论 -
《mysql基础》6-锁
Mysql的锁是为了处理并发添加的锁概念。java开发中也会用到锁概念,其实锁跟并发是孪生子。有并发那就要考虑数据的ACID。锁能够保证并发时的串行。那Java中的锁有重量级锁,轻量级锁,还有偏向锁等概念。mysql中也有1-全局锁,2-表级锁,3-行锁的概念1-全局锁。flush-table-with-read-lock.(FTWRL)命令给数据库添加全局锁,这样的话,所有的事务都只能读,不能修改数据。一般用于数据备份的时候,所有的更新操作-表修改/删除操作都会被阻塞。全局锁锁定之后,所有的修原创 2020-06-01 16:06:45 · 148 阅读 · 0 评论 -
《mysql基础》6-锁2
上面的一节总结了一下全局锁/表锁,这次讲行锁Mysql支持行锁是有引擎InnoDB实现的,MylSAM不支持行锁,所以在操作业务时会锁住整个表,那这样出现并发的情况就大大扩大了。java编程的时候,我们有锁范围最小原则,不必要的数据不要加锁,但是表锁会锁定整个表内容,所以不适合高并发的情况。数据行锁的意识就是在需要的数据行上加锁,比如下面这条语句update t1 set age = 18 where name = 'lisan'InnoDB会在lisan这条记录上加锁,不会锁住整个t原创 2020-06-01 16:54:51 · 164 阅读 · 0 评论 -
《mysql基础》7-事务的可见性
第4节讲到了事务的隔离级别,1:读未提交。2:读提交。3:可重复读。4:串行化第6节讲到了锁,1:全局锁(FTWRL),2:表级锁(MDL/表锁)。3:行锁(InnoDB)。所以到底我们事务与事务之间的修改到底能不能其他事务看到。其实我们程序中也有很多这样的情况,在可重复性读的隔离级别下开启事务A,事务Bmysql> CREATE TABLE `t` ( `id` int(11) NOT NULL, `k` int(11) DEFAULT NULL, PRIMARY K原创 2020-06-02 09:58:16 · 1738 阅读 · 0 评论