-
主键和外键的区别
主键:主键用于唯一标识一个元组,不能有重复,不能重复,不能为空,一个表只有一个主键
外键:其他表的主键,用于和其他表建立连接,外键可以是重复的,可以是空值,可以有多个,但是不推荐用,增加了复杂性和额外工作,分库分表的情况下是不能生效的 -
drop delete truncate
drop(丢弃数据): drop table 表名 ,直接将表都删除掉,在删除表的时候使用。truncate (清空数据) : truncate table 表名 ,只删除表中的数据,再插入数据的时候自增长 id 又从 1 开始,在清空表中数据的时候使用。
delete(删除数据) : delete from 表名 where 列名=值,删除某一行的数据,如果不加 where 子句和truncate table 表名作用类似。 -
关系形数据库
建立在关系模型上的数据库。表明了数据库中所存储的数据之间的关系
sql结构化查询语言,专门和数据库打交道。
MySQL 是一种关系型数据库,主要用于持久化存储我们的系统中的一些数据比如用户信息 -
mysql数据类型
数值类型:
整形:tinyint、smallint、mediumint、bigint
浮点型:float、double
字符串类型:char、varchar、tinytext、text、mediumtext、longtext、、、、
日期时间类型:year、time、date、datetime、timestamp
MySQL 中的整数类型可以使用可选的 UNSIGNED 属性来表示不允许负值的无符号整数。使用 UNSIGNED 属性可以将正整数的上限提高一倍,因为它不需要存储负数值。
CHAR 和 VARCHAR 是最常用到的字符串类型,两者的主要区别在于:CHAR 是定长字符串,VARCHAR 是变长字符串。
**VARCHAR(100)和 VARCHAR(10)都是变长类型,表示能存储最多 100 个字符和 10 个字符。**因此,VARCHAR (100) 可以满足更大范围的字符存储需求,有更好的业务拓展性。而 VARCHAR(10)存储超过 10 个字符时,就需要修改表结构才可以。虽说 VARCHAR(100)和 VARCHAR(10)能存储的字符范围不同,但二者存储相同的字符串,所占用磁盘的存储空间其实是一样的,这也是很多人容易误解的一点。不过,**VARCHAR(100) 会消耗更多的内存。这是因为 VARCHAR 类型在内存中操作时,通常会分配固定大小的内存块来保存值,即使用字符类型中定义的长度。**例如在进行排序的时候,VARCHAR(100)是按照 100 这个长度来进行的,也就会消耗更多内存
DECIMAL 和 FLOAT 的区别是:DECIMAL 是定点数,FLOAT/DOUBLE 是浮点数。DECIMAL 可以存储精确的小数值,FLOAT/DOUBLE 只能存储近似的小数值。
Java中用bigdecimal来对应
DATETIME 类型没有时区信息,TIMESTAMP 和时区有关
TIMESTAMP 只需要使用 4 个字节的存储空间,但是 DATETIME 需要耗费 8 个字节的存储空间。
Timestamp 表示的时间范围更小。 -
null和”“的区别?
NULL 跟 ‘’(空字符串)是两个完全不一样的值,区别如下:NULL 代表一个不确定的值,就算是两个 NULL,它俩也不一定相等。例如,SELECT NULL=NULL的结果为 false,但是在我们使用DISTINCT,GROUP BY,ORDER BY时,NULL又被认为是相等的。''的长度是 0,是不占用空间的,而NULL 是需要占用空间的。NULL 会影响聚合函数的结果。例如,SUM、AVG、MIN、MAX 等聚合函数会忽略 NULL 值。 COUNT 的处理方式取决于参数的类型。如果参数是 (COUNT()),则会统计所有的记录数,包括 NULL 值;如果参数是某个字段名(COUNT(列名)),则会忽略 NULL 值,只统计非空值的个数。查询 NULL 值时,必须使用 IS NULL 或 IS NOT NULLl 来判断,而不能使用 =、!=、 <、> 之类的比较运算符。而’'是可以使用这些比较运算符的 -
mysql架构
-
存储引擎
MySQL 支持多种存储引擎。innoDB、MYISAM等存储引擎。存储引擎是基于表的,插件式架构。
MyISAM 不支持事务和行级锁,而且最大的缺陷就是崩溃后无法安全恢复
InnoDB 支持行级锁(row-level locking)和表级锁,默认为行级锁
MyISAM 不提供事务支持。InnoDB 提供事务支持,实现了 SQL 标准定义了四个隔离级别(读未提交、读已提交、可重复读(默认级别)、串行化),具有提交(commit)和回滚(rollback)事务的能力。并且,InnoDB 默认使用的 REPEATABLE-READ(可重读)隔离级别是可以解决幻读问题发生的(基于 MVCC 和 Next-Key Lock)。
InnoDB 支持行级别的锁粒度,MyISAM 不支持,只支持表级别的锁粒度。
MyISAM 不提供事务支持。InnoDB 提供事务支持,实现了 SQL 标准定义了四个隔离级别。
MyISAM 不支持外键,而 InnoDB 支持。
MyISAM 不支持 MVCC,而 InnoDB 支持。
虽然 MyISAM 引擎和 InnoDB 引擎都是使用 B+Tree 作为索引结构,但是两者的实现方式不太一样。
MyISAM 不支持数据库异常崩溃后的安全恢复,而 InnoDB 支持。InnoDB 的性能比 MyISAM 更强大。 -
索引
索引是一种用于快速查询和检索数据的数据结构,其本质可以看成是一种排序好的数据结构(B+树) -
mysql查询索引
执行查询语句的时候,会先查询缓存。不过,MySQL 8.0 版本后移除
开启查询缓存后在同样的查询条件以及数据情况下,会直接在缓存中返回结果
缓存虽然能够提升数据库的查询性能,但是缓存同时也带来了额外的开销,每次查询后都要做一次缓存操作,失效后还要销毁 -
mysql日志
慢查询日志:慢查询日志记录了执行时间超过一定阈值的 SQL 查询语句,用于识别和优化执行效率较低的查询操作。
undo log**(回滚日志):事务回滚,实现mvcc**。存储了事务对数据库所做的修改操作的逆操作信息
redo log():redo 日志记录了对数据库的物理更改操作,用于数据库的崩溃恢复和数据持久性保证
binlog 日志(二进制)记录了对数据库的修改操作,包括 INSERT、UPDATE、DELETE 等数据更改操作。binlog 日志是 MySQL 主从复制和数据库恢复的重要基础, -
mysql事务
事务是逻辑上的一组操作,要么都执行,要么都不执行。
ACID(原子性、一致性、隔离性、持久性)
数据库事务:要么全部执行成功,要么全部不执行 -
并发事务带来的问题?
多个事务并发运行,经常会操作相同的数据来完成各自的任务(多个用户对同一数据进行操作)。并发虽然是必须的,但可能会导致以下的问题
脏读:一个事务读取数据并且对数据进行了修改,这个修改对其他事务来说是可见的,即使当前事务没有提交。这时另外一个事务读取了这个还未提交的数据,但第一个事务突然回滚,导致数据并没有被提交到数据库,那第二个事务读取到的就是脏数据,这也就是脏读的由来(一个事务修改了数据,但回滚了,但另一个事务在回滚前使用了这个数据(修改之后的数据),就是脏数据)
不可重复读:指在一个事务内多次读同一数据。在这个事务还没有结束时,另一个事务也访问该数据。那么,在第一个事务中的两次读数据之间,由于第二个事务的修改导致第一个事务两次读取的数据可能不太一样。这就发生了在一个事务内两次读到的数据是不一样的情况,(一个事务多次读取一个数据,在两次之间另一个事务修改了数据,导致两次数据不一样)
幻读:一个事务读取了几行数据,接着另一个并发事务插入了一些数据时。在随后的查询中,第一个事务就会发现多了一些原本不存在的记录,就好像发生了幻觉一样,所以称为幻读(一个事务读取了几行数据,另一个事务插入了一些数据,第一个事务再查询发现了之前不存在的数据)
不可重复读的重点是内容修改或者记录减少比如多次读取一条记录发现其中某些记录的值被修改;
幻读的重点在于记录新增比如多次执行同一条查询语句(DQL)时,发现查到的记录增加了 -
并发事务控制
锁(类似悲观锁 表锁、行锁):读写锁(共享锁(读锁)、排他锁(写锁))读写锁可以做到读读并行,但是无法做到写读、写写并行根据根据锁粒度的不同,又被分为 表级锁(table-level locking) 和 行级锁(row-level locking)。行级锁的粒度更小,仅对相关的记录上锁即可
MVCC(多版本并发控制):即对一份数据会存储多个版本,通过事务的可见性来保证事务能看到自己应该看到的版本.它的底层实现主要是分为了三个部分,第一个是隐藏字段,第二个是undo log日志,第三个是readView读视图。 -
sql隔离级别
读未提交(都不可以)
读已提交(只能限制脏读)
可重复读**(默认)**(不能限制幻读)
串行化(脏读、不可重复读、幻读都可解决,但效率低)
MySQL 的隔离级别基于锁和 MVCC 机制共同实现的。 -
mysql锁机制
-MyISAM 仅仅支持表级锁(table-level locking),一锁就锁整张表,这在并发写的情况下性非常差。InnoDB 不光支持表级锁(table-level locking),还支持行级锁(row-level locking),默认为行级锁。
表锁:锁整张表 针对非索引字段加的锁
行锁:锁操作的行。针对索引字段加的锁
当我们执行 UPDATE、DELETE 语句时,如果 WHERE条件中字段没有命中唯一索引或者索引失效的话,就会导致扫描全表对表中的所有行记录进行加锁 -
innoDB行锁的类型
记录锁(Record Lock):也被称为记录锁,属于单个行记录上的锁。
间隙锁(Gap Lock):锁定一个范围,不包括记录本身。
临键锁(Next-Key Lock):Record Lock+Gap Lock,锁定一个范围,包含记录本身,主要目的是为了解决幻读问题(MySQL 事务部分提到过)。记录锁只能锁住已经存在的记录,为了避免插入新记录,需要依赖间隙锁。 -
共享锁 排他锁?
不论是表级锁还是行级锁,都存在共享锁(Share Lock,S 锁)和排他锁(Exclusive Lock,X 锁)这两类:
共享锁(S 锁):又称读锁,事务在读取记录的时候获取共享锁,允许多个事务同时获取(锁兼容)。
排他锁(X 锁):又称写锁/独占锁,事务在修改记录的时候获取排他锁,不允许多个事务同时获取。如果一个记录已经被加了排他锁,那其他事务不能再对这条事务加任何类型的锁(锁不兼容)
mysql
最新推荐文章于 2024-07-11 21:41:59 发布