分类:mysql - Alias的博客

详谈Buffer Pool为什么要有Buffer Pool?虽然说 MySQL 的数据是存储在磁盘里的,但是也不能每次都从磁盘里面读取数据,这样性能是极差的。 要想提升查询性能,加个缓存就行了嘛。所以,当数据从磁盘中取出后,缓存内存中,下次查询同样的数据的时候,直接从内存中读取。 为此,Innodb 存储引擎设计了一个缓冲池(*Buffer Pool*),来提高数据库的读写性能。 有了缓冲...

mysql日志更新语句的流程会涉及到 undo log(回滚日志)、redo log(重做日志) 、binlog (归档日志)这三种日志: undo log(回滚日志):是 Innodb 存储引擎层生成的日志,实现了事务中的原子性,主要用于事务回滚和 MVCC。 redo log(重做日志):是 Innodb 存储引擎层生成的日志,实现了事务中的持久性,主要用于掉电等故障恢复; binlo...

mysql死锁死锁的发生本次案例使用存储引擎 Innodb,隔离级别为可重复读(RR)。 接下来,我用实战的方式来带大家看看死锁是怎么发生的。 我建了一张订单表,其中 id 字段为主键索引,order_no 字段普通索引,也就是非唯一索引: 1234567CREATE TABLE `t_order` ( `id` int NOT NULL AUTO_INCR...

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 的内...