MySQL数据库知识点整合

事务ACID是什么

Mysql事务的四大特性是指

原子性(Atomicity): 事务是不可分割的最小工作单元,整个操作要么全部成功,要么全部失败,一般就是通过commit和rollback来控制。

一致性(Consistency):数据库总能从一个一致性的状态转换到另一个一致性的状态,只要有任何一方发生异常就不会成功提交事务。

隔离性(Isolation): 一个事务相对于另一个事务是隔离的,一个事务所做的修改是在最终提交以前,对其他事务是不可见的。

持久性(Durability):一旦事务提交,则其所做的修改就会永久保存到数据库中。此时即使系统崩溃,修改的数据也不会丢失。

解析脏读、不可重复读、幻读

脏读: 事务中的数据修改即使没有提交,其他事务也能看见,事务可以读到未提交的数据称为脏读。(A事务修改了数据单没有提交,但B事务却读到了数据,这就称为脏读)

不可重复读: 同个事务前后多次读取,不能读到相同的数据内容,中间另一个事务也操作了该同一数据。(A事务第一次读取数据xx,之后B事务对数据xx进行了修改,A事务再次读取数据时并不能读到数据xx,这就称为不可重复读)

幻读:当某个事务在读取某个范围内的记录时,另外一个事务又在该范围内插入了新的记录,当之前的事务再次读取该范围的记录时,发现两次不一样,产生幻读。

幻读和不可重复读的区别是:前者是一个范围,后者是本身,从总的结果来看, 两者都表现为两次读取的结果不一致

事务的隔离级别由低到高列举

事务的隔离级别越高,事务越安全,同时并发能力越差。

Read Uncommitted(未提交读,读取未提交内容)

事务中的修改即使没有提交,其他事务也能看见,事务可以读到未提交的数据称为脏读,也存在不可重复读、幻读问题。

Read Committed(提交读,读取提交内容)

一个事务开始后只能看见已经提交的事务所做的修改,在事务中执行两次同样的查询可能得到不一样的结果,也叫做不可重复读(前后多次读取,不能读到相同的数据内容),也存幻读问题。

Repeatable Read(可重复读,mysql默认的事务隔离级别)

解决脏读、不可重复读的问题,存在幻读的问题,使用 MMVC机制,实现可重复读。
幻读问题:MySQL的InnoDB引擎通过MVCC自动帮我们解决,即多版本并发控制。

Serializable(可串行化)

解决脏读、不可重复读、幻读,可保证事务安全,但强制所有事务串行执行,所以并发效率低。

Mysql常见的存储引擎介绍

常见的存储引擎:InnoDB、MyISAM、MEMORY、MERGE、ARCHIVE、CSV…

一般比较常用的有InnoDB、MyISAM

MySQL 5.5以上的版本默认是InnoDB,5.5之前默认存储引擎是MyISAM

Mysql的存储引擎InnoDB&MyISAM区别和选择问题

区别项InnoDBMyISAM
事务支持不支持
锁粒度行锁,适合高并发表锁,不适合高并发
是否默认默认非默认
支持外键支持外键不支持
适合场景读写均衡,写大于读场景,需要事务读多写少场景,不需要事务
全文索引不支持,可以通过插件实现, 更多使用ElasticSearch支持全文索引

MySQL的功能索引

索引名称特点创建语句
普通索引最基本的索引,仅加速查询CREATE INDEX idx_name ON table_name(filed_name)
唯一索引加速查询,列值唯一,允许为空;组合索引则列值的组合必须唯一CREATE UNIQUE INDEX idx_name ON table_name(filed_name_1,filed_name_2)
主键索引加速查询,列值唯一,一个表只有1个,不允许有空值ALTER TABLE table_name ADD PRIMARY KEY ( filed_name )
组合索引加速查询,多条件组合查询CREATE INDEX idx_name ON table_name(filed_name_1,filed_name_2);
覆盖索引索引包含所需要的值,不需要“回表”查询,比如查询 两个字段,刚好是 组合索引 的两个字段
全文索引对内容进行分词搜索,仅可用于Myisam, 更多用ElasticSearch做搜索ALTER TABLE table_name ADD FULLTEXT ( filed_name )

对比索引优缺点以及使用注意点

考虑点:结合实际的业务场景,在哪些字段上创建索引,创建什么类型的索引。

索引好处:
快速定位到表的位置,减少服务器扫描的数据;
有些索引存储了实际的值,特定情况下只要使用索引就能完成查询。

索引缺点:
索引会浪费磁盘空间,不要创建非必要的索引;
插入、更新、删除需要维护索引,带来额外的开销;
索引过多,修改表的时候重构索引性能差。

索引优化实践

  • 前缀索引,特别是TEXT和BLOG类型的字段,只检索前面几个字符,提高检索速度
  • 尽量使用数据量少的索引,索引值过长查询速度会受到影响
  • 选择合适的索引列顺序
  • 内容变动少,且查询频繁,可以建立多几个索引
  • 内容变动频繁,谨慎创建索引
  • 根据业务创建适合的索引类型,比如某个字段常用来做查询条件,则为这个字段建立索引提高查询速度
  • 组合索引选择业务查询最相关的字段

数据库查询指令的执行顺序

  • from 从哪个表查询
  • where 初步过滤条件
  • group by 过滤后进行分组[重点]
  • having对分组后的数据进行二次过滤[重点]
  • select 查看哪些结果字段
  • order by 按照怎样的顺序进行排序返回[重点]

MySQL中varchar和char的区别

对比项char(16)varchar(16)
长度特点长度固定,存储字符长度可变,存储字符
长度不足情况插入的长度小于定义长度时,则用空格填充小于定义长度时,按实际插入长度存储
性能存取速度比varchar快得多存取速度比char慢得多
使用场景适合存储很短的,固定长度的字符串,如手机号,MD5值等适合用在长度不固定场景,如收货地址,邮箱地址等

MySQL中datetime和timestamp的区别

类型占据字节范围时区问题
datetime8 字节1000-01-01 00:00:00到 9999-12-31 23:59:59存储与时区无关,不会发生改变
timestamp4 字节1970-01-01 00:00:01 到 2038-01-19 11:14:07存储的是与时区有关,随数据库的时区而发生改变
为什么timestamp只能到2038年?

MySQL的timestamp类型是4个字节,最大值是2的31次方减1,结果是2147483647,转换成北京时间就是2038-01-19 11:14:07

针对大数据量sql分页优化思路

现象:千万级别数据,比如数据流水、日志记录等,数据库正常的深度分页会很慢。慢的原因:select * from product limit N,M
MySQL执行此类SQL时需要先扫描到N行,然后再去取M行,N越大,MySQL扫描的记录数越多,SQL的性能就会越差。

优化方式:
1、后端、前端缓存;
2、使用ElasticSearch分页搜索;
3、合理使用 mysql 查询缓存,覆盖索引进行查询分页;
select title,cateory from product limit 1000000,100
4、如果id是自增且不存在中间删除数据,使用子查询优化,定位偏移位置的 id;
select * from oper_log where type=‘BUY’ limit 1000000,100; //5.秒
select id from oper_log where type=‘BUY’ limit 1000000,1; // 0.4秒
select * from oper_log where type=‘BUY’ and id>=(select id from oper_log where type=‘BUY’ limit 1000000,1) limit 100; //0.8秒

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

拾叁呀

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值