mysql学习笔记

数据库基础知识

 

 

 

 

 

 

数据库三范式: 

 

 

 delete表数据后,自增主键会从删除点继续自增。可以用alter将自增起始点改成1

ALTER TABLE `表名` AUTO_INCREMENT =1;

 

  插入:insert into table values

update table set  where

delete from table where

select from table where

 

 

 

myISAM和InnoDB存储引擎的区别:

1.是否支持行级锁

MyISAM 只有表级锁(table-level locking),而 InnoDB 支持行级锁(row-level locking)和表级锁,默认为行级锁。

也就说,MyISAM 一锁就是锁住了整张表,这在并发写的情况下是多么滴憨憨啊!这也是为什么 InnoDB 在并发写的时候,性能更牛皮了!

2.是否支持事务

MyISAM 不提供事务支持。

InnoDB 提供事务支持,具有提交(commit)和回滚(rollback)事务的能力。

3.是否支持外键

MyISAM 不支持,而 InnoDB 支持。

🌈 拓展一下:

一般我们也是不建议在数据库层面使用外键的,应用层面可以解决。不过,这样会对数据的一致性造成威胁。具体要不要使用外键还是要根据你的项目来决定。

4.是否支持数据库异常崩溃后的安全恢复

MyISAM 不支持,而 InnoDB 支持。

使用 InnoDB 的数据库在异常崩溃后,数据库重新启动的时候会保证数据库恢复到崩溃前的状态。这个恢复的过程依赖于 redo log

🌈 拓展一下:

  • MySQL InnoDB 引擎使用 redo log(重做日志) 保证事务的持久性,使用 undo log(回滚日志) 来保证事务的原子性
  • MySQL InnoDB 引擎通过 锁机制MVCC 等手段来保证事务的隔离性( 默认支持的隔离级别是 REPEATABLE-READ )。
  • 保证了事务的持久性、原子性、隔离性之后,一致性才能得到保障。

5.是否支持 MVCC

MyISAM 不支持,而 InnoDB 支持。

讲真,这个对比有点废话,毕竟 MyISAM 连行级锁都不支持。

MVCC 可以看作是行级锁的一个升级,可以有效减少加锁操作,提供性能。

为什么不使用外键会对一致性造成威胁:大概就是如果设置了外键,进行修改操作会有限制。

 

 

 

 

 

 

 

 

 

mysql查询缓存

执行查询语句的时候,会先查询缓存。不过,MySQL 8.0 版本后移除,因为这个功能不太实用

 

 

查询缓存不命中的情况:(1)任何两个查询在任何字符上的不同都会导致缓存不命中。

查询缓存不命中的情况:(2))如果查询中包含任何用户自定义函数、存储函数、用户变量、临时表、MySQL 库中的系统表,其查询结果也不会被缓存。

查询缓存不命中的情况:(3)缓存建立之后,MySQL 的查询缓存系统会跟踪查询中涉及的每张表,如果这些表(数据或结构)发生变化,那么和这张表相关的所有缓存数据都将失效。

 

 

数据库事务:逻辑上的一个整体,要么都做,要么都不做。

 

 

 

 

 

 

 

下面的很重要,一定要理解。 

 

 

 

 

 

 varchar和char的区别

VARCHAR类型用于存储可变长字符串,是最常见的字符串数据类型。

VARCHAR需要使用1或2个额外字节记录字符串的长度:如果列的最大长度小于或等于255字节,则只使用1个字节表示,否则使用2个字节。  因为一个字节八位只能表示无符号整数到255.

VARCHAR节省了存储空间,所以对性能也有帮助。但是,由于行是变长的,在UPDATE时可能使行变得比原来更长,这就导致需要做额外的工作。

 CHAR类型是定长的:MySQL总是根据定义的字符串长度分配足够的空间。当存储CHAR值时,MySQL会删除所有的末尾空格。最长存储255个字符。与编码无关。varchar可以存储空格。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 比如之前有7个字段,现在变成了八个,go之前的查询语句返回七个字段,如果顺序改变,就会有问题。

 

 

 

 

 

 

 

 

 

 

 

 

 

 MVCC多版本并发控制

首先了解一致性非锁定读和锁定读。InnoDB引擎普通索引都会使用MVCC。可以解决幻读。

另外如果当前读,每次都读取最新的数据(加锁),如果两次查询中间有其他事务插入数据,就会幻读。(加锁也只是对行加锁)因此需要对间隙也加锁,锁定间隙不让插入新数据。

 

 

 以上就是为什么InnoDB需要使用MVCC和间隙锁解决幻读。MVCC只能解决一致性非锁定读的幻读,也就是普通读。加锁的读反而会出现幻读。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

mysql的数据何时真正写入磁盘

 

 

 

 

 

 

 

 

 

整理自www.javaguide.cn

posted on 2021-12-26 17:21  nisico  阅读(36)  评论(0)    收藏  举报

导航