MySQL基础知识小结

**事务(Transaction)**
是并发控制的基本单位。所谓的事务,它是一个操作序列,

事务四大特性(ACID)
原子性:是指事务是一个最小单元,不可再分隔,成为一个整体。事务要么全部执行,要么全部不执行,不存在中间状态。
一致性:是指事务中的方法要么同时成功,要么都不成功。比如A向B转账,要不都成功,要不都失败。
隔离性:MySQL数据库中可以同时启动很多的事务,但是,事务和事务之间他们是相互分离的,也就是互不影响的。通过锁来保证。
持久性:即当成功插入一条数据库记录时,数据库必须保证有一条数据永久的写入到数据库磁盘中。

事务的并发
1、事务的并发及多个事务同时执行

事务并发带来的问题
1、脏写
事务2中修改数据但还没提交
事务1修改了事务2中的数据,
接着事务2提交数据
接着事务1回滚,
导致事务2中的修改被覆盖回滚

2、脏读
事务2中修改数据但还没提交
事务1读取了事务2中的数据并提交,
事务2接着回滚,
导致事务1读取到了不存在的数据。

3、不可重复读
即重复读会出问题,事务1在同一条件下当前时刻读到数据和下一个时刻读到的数据不一致,即这两个时刻中间有别的事务进行了数据修改

4、幻读
即事务1在同一条件下下一时刻读到的数据行数比当前时刻多,仿佛出现幻觉,因为这两个时刻中间有别的事务进行了添加数据

事务隔离级别,每个级别会引发什么问题
事务的隔离级别:读未提交、读已提交、可重复读、串行提交
读未提交:会出现脏读、脏写、不可重复读、幻读
读已提交:会出现不可重复读、幻读现象
可重复读:会出现幻读现象
串行提交:不会出现上述问题

mysql默认是哪个级别
可重复读

mysql都有什么锁
1、锁是计算机协调多个进程或线程并发访问某一资源的机制.
2、锁的各种操作,包括获得锁、检测锁是否是否已解除、释放锁等。
其他:
3、mysql锁乐观锁、悲观锁、共享锁、排它锁、行锁、表锁
共享锁(读锁):其他事务可以读,但不能写。
排他锁(写锁) :其他事务不能读取,也不能写。
按力度分:表级锁、页面锁、行级锁。
默认情况下有表锁和行锁
表级锁:开销小,加锁快;不会出现死锁;锁定粒度大,发生锁冲突的概率最高,并发度最低。
行级锁:开销大,加锁慢;会出现死锁;锁定粒度最小,发生锁冲突的概率最低,并发度也最高。

mysql悲观锁和乐观锁
1、悲观锁认为总会发生并发冲突,所以在整个数据处理过程中,需要将数据锁定。
悲观锁:比较适合写入操作比较频繁的场景,如果出现大量的读取操作,每次读取的时候都会进行加锁,这样会增加大量的锁的开销,降低了系统的吞吐量。
共享锁,又称为读锁,是悲观锁的一种,可以查看但无法修改和删除的一种数据锁.

2、乐观锁认为不会发生并发冲突,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据。
比较适合读取操作比较频繁的场景,如果出现大量的写入操作,数据发生冲突的可能性就会增大,为了保证数据的一致性,应用层需要不断的重新获取数据,这样会增加大量的查询操作,降低了系统的吞吐量。

select 时怎么加排它锁?
锁冲突和死锁
1、死锁是两个或多个事务/请求之间的锁出现了死循环。
2、锁冲突:有个session持有了某个资源(比如id=1的数据)的写锁,另一个seession正好也要请求同一条数据的写锁,就必须被阻塞,直到前面的session释放锁为止,我一般称之为”锁死“或”长时间锁等待“。

**mysql常见的三种存储引擎的区别?**
1、InnoDB
2、MyISAM
3、MEMORY

MySQL的MyISAM与InnoDB两种存储引擎在事务、锁级别,各自的适用场景?
查询语句不同元素(where、join、limit、group by、having等等)执行先后顺序?
总结下顺序:我(W)哥(G)是(SH)偶(O)像 join where group by limit
W(where)->G(Group)->S(Select)->H(Having)->O(Order)
1、执行where xx对全表数据做筛选,返回第1个结果集。
2.针对第1个结果集使用group by分组,返回第2个结果集。
3.针对第2个结果集中的每1组数据执行select xx,有几组就执行几次,返回第3个结果集。
4.针对第3个结集执行having xx进行筛选,返回第4个结果集。
5.针对第4个结果集排序。
6、limit

什么是临时表,临时表什么时候删除?
临时表与实体表类似,只是在使用过程中,临时表是存储在系统数据库tempdb中。当我们不再使用临时表的时候,临时表会自动删除。

**mysql索引**
1、索引其实是一种数据结构,能够帮助我们快速的检索数据库中的数据。
2、MySQL主要有两种结构:Hash索引和B+ Tree索引

建立索引有什么优缺点?
索引的优点:1. 天生排序。2. 快速查找。
索引的缺点:1. 占用空间。2. 降低更新表的速度。
为什么占用空间:因为建立索引会把排序后组织成B树的数据,放到磁盘上。

聚集索引和非聚集索引区别?
像查字典一样
拼音检索就是聚集索引;笔画检索就是非聚集索引
正文内容按照一个特定维度排序存储,这个特定的维度就是聚集索引;
非聚集索引索引项顺序存储,但索引项对应的内容却是随机存储的;

mysql B+Tree索引和Hash索引的区别?
sql查询语句确定创建哪种类型的索引?如何优化查询?
非关系型数据库和关系型数据库区别,优势比较?
1、关系型数据库一般都有固定的表结构,非关系型数据库是基于文档的,K-V键值对的存储机制。
2、非关系型数据库比关系型数据库读写速度快
3、非关系型数据库的扩展性好
4、关系型数据库要求一致性,非关系型没有严格要求。

数据库三范式,根据某个场景设计数据表?
数据库的读写分离、主从复制,主从复制分析的 7 个问题?
使用explain优化sql和索引?

**MySQL慢查询怎么解决?**
查看慢查询日志,查找慢查询原因,看是不是索引问题,索引是否错误。
优化查询语句,避免三表以上join等
是否可以用子查询减少查询次数。
对大量的数据,采用分库分表方式。

什么是 内连接、外连接、交叉连接、笛卡尔积等?
内连接:
select * from a
inner join b
on a.id=b.parend_id
左连接:
select * from a
left join b
on a.id=b.parend_id
右连接
select * from a
right join b
on a.id=b.parend_id

varchar和char的使用场景?
char使用指定长度的固定长度表示字符串的一种字段类型
varchar(M)是一种比char更加灵活的数据类型,同样用于表示字符数据,但是varchar可以保存可变长度的字符串。

mysql 高并发环境解决方案?
数据库崩溃时事务的恢复机制
REDO日志和UNDO日志
REDO 为了重做对数据页(page)更改保存的信息,用于恢复
UNDO 为了撤销对数据记录(tuple)更改保存的信息,用于回滚事务

1、CONCAT(A, B) – 连接两个字符串值以创建单个字符串输出。通常用于将两个
或多个字段合并为一个字段。
2、FORMAT(X, D)- 格式化数字 X 到 D 有效数字。
3、CURRDATE(), CURRTIME()- 返回当前日期或时间。
4、NOW() – 将当前日期和时间作为一个值返回。
5、MONTH(),DAY(),YEAR(),WEEK(),WEEKDAY() – 从日期
值中提取给定数据。
6、HOUR(),MINUTE(),SECOND() – 从时间值中提取给定数据。
7、DATEDIFF(A,B) – 确定两个日期之间的差异,通常用于计算年龄
8、SUBTIMES(A,B) – 确定两次之间的差异。
9、FROMDAYS(INT) – 将整数天数转换为日期值。
案例
MySQL 数据库作发布系统的存储,一天五万条以上的增量,
预计运维三年,怎么优化
1、设计良好的数据库结构,允许部分数据冗余,尽量避免 join 查询,提高效率。 
2、选择合适的表字段数据类型和存储引擎,适当的添加索引。
3、MySQL 库主从读写分离。
4、找规律分表,减少单表中的数据量提高查询速度。
5、添加缓存机制,比如 memcached,apc 等。
6、不经常改动的页面,生成静态页面。
7、书写高效率的 SQL。比如 SELECT * FROM TABEL 改为 SELECT field_1,field_2, field_3 FROM TABLE.
锁的优化策略
1、读写分离
2、分段加锁
3、减少锁持有的时间
4、多个线程尽量以相同的顺序去获取资源不能将锁的粒度过于细化,不然可能会出现线程的加锁和释放次数过多,反而效率不如一次加一把大锁。

猜你喜欢

转载自blog.csdn.net/jassyzhen/article/details/115299980