Alias的博客

mysql是如何加锁的什么sql语句会加行级锁?InnoDB 引擎是支持行级锁的,而 MyISAM 引擎并不支持行级锁,所以后面的内容都是基于 InnoDB 引擎 的。 所以,在说 MySQL 是怎么加行级锁的时候,其实是在说 InnoDB 引擎是怎么加行级锁的。 普通的 select 语句是不会对记录加锁的,因为它属于快照读,是通过 MVCC(多版本并发控制)实现的。 如果要在查询时对记录...

mysql有哪些锁这次我们主要来说说mysql的锁,主要是 Q&A 的形式,看起来会比较轻松。 全局锁 全局锁是怎么用的? 要使用全局锁,则要执行这条命令: 1flush tables with read lock 执行后,整个数据库就处于只读状态了,这时其他线程执行以下操作,都会被阻塞: 对数据的增删改操作,比如 insert、delete、update等语句; 对表结构的更...

mysql中可重复读隔离级别是否完全解决幻读我们在上文提到过,MySQL InnoDB 引擎的默认隔离级别虽然是「可重复读」,但是它很大程度上避免幻读现象(并不是完全解决了),解决的方案有两种: 针对快照读(普通 select 语句),是通过 MVCC 方式解决了幻读,因为可重复读隔离级别下,事务执行过程中看到的数据,一直跟这个事务启动时看到的数据是一致的,即使中途有其他事务插入了一条数据...

mysql中事务隔离级别如何实现事务的特性事务是由 MySQL 的引擎来实现的,我们常见的 InnoDB 引擎它是支持事务的。 不过并不是所有的引擎都能支持事务,比如 MySQL 原生的 MyISAM 引擎就不支持事务,也正是这样,所以大多数 MySQL 的引擎都是用 InnoDB。 事务看起来感觉简单,但是要实现事务必须要遵守 4 个特性,分别如下: 原子性(Atomicity):一个事...

mysql中count(*)和count(1)的区别当我们对一张数据表中的记录进行统计的时候,习惯都会使用 count 函数来统计,但是 count 函数传入的参数有很多种,比如 count(1)、count(*)、count(字段) 等。 哪种count性能最好?先说结论: count(*)=count(1)>count(主键字段)>count(字段) count()是什么?c...

详谈索引失效的几种情况对索引使用左或者左右模糊匹配当我们使用左或者左右模糊匹配的时候,也就是 like %xx 或者 like %xx% 这两种方式都会造成索引失效。 比如下面的 like 语句,查询 name 后缀为「林」的用户,执行计划中的 type=ALL 就代表了全表扫描,而没有走索引。 12// name 字段为二级索引select * from t_user ...

从数据页的角度看B+树InnoDB是如何存储数据的?在前面的博客中我们提到过InnoDB 的数据是按「数据页」为单位来读写的,也就是说,当需要读一条记录的时候,并不是将这个记录本身从磁盘读出来,而是以页为单位,将其整体读入内存。 数据库的 I/O 操作的最小单位是页,InnoDB 数据页的默认大小是 16KB,意味着数据库每次读写都是以 16KB 为单位的,一次最少从磁盘中读取 16K 的内...

MySQL索引什么是索引在数据库中,索引的定义就是帮助存储引擎快速获取数据的一种数据结构,形象的说就是索引是数据的目录。 MySQL 存储引擎有 MyISAM 、InnoDB、Memory,其中 InnoDB 是在 MySQL 5.5 之后成为默认的存储引擎。 下图为mysql结构图,索引和数据就是位于存储引擎中: 索引的分类我们可以按照四个角度来分类索引。 按「数据结构」分类:B+tr...

mysql如何存储一行记录mysql的数据存放在哪个文件?众所周知,mysql的数据是保存在磁盘的,那么具体是保存在什么文件呢? MySQL存储的行为是由存储引擎实现的,而InnoDB是我们常用的存储引擎,也是目前mysql默认的存储引擎。所以我们主要以InnoDB存储引擎展开讨论。 我们可以先来看看MySQL数据库的文件存放在哪个目录: 我们每创建一个database就会在/var/li...

Redis的分布式锁集群下的线程并发问题我们在使用synchronized进行加锁时,由于每一个JVM有一个锁监视器,这就能够保证每次只有一个线程能获取这把锁。但是若在集群环境下(假设两台),那就会有两个JVM,也就会有两个锁监视器,就会有多个线程获取到锁,这样就没办法实现多JVM之间的互斥,就会产生线程并发问题 分布式锁实现一个在多个JVM外部的同一个锁监视器 分布式锁:满足分布式系统下或...