MySQL
MySQL
事务
事务的四个条件(ACID)
原子性(Atomicity)
一个事务(transaction)中的所有操作,要么全部完成,要么全部不完成,不会结束在中间某个环节。事务在执行过程中发生错误,会被回滚(Rollback)到事务开始前的状态,就像这个事务从来没有执行过一样。
一致性(Consistency):
在事务开始之前和事务结束以后,数据库的完整性没有被破坏。这表示写入的资料必须完全符合所有的预设规则,这包含资料的精确度、串联性以及后续数据库可以自发性地完成预定的工作。
隔离性(Isolation,又称独立性):
数据库允许多个并发事务同时对其数据进行读写和修改的能力,隔离性可以防止多个事务并发执行时由于交叉执行而导致数据的不一致。
事务隔离级别包括读未提交(Read uncommitted)、读提交(Read committed)、可重复读(Repeatable read)和串行化(Serializable)。MySQL 默认为可重复度 Repeatable read。
持久性(Durability):
事务提交后数据修改是持久的。
事务隔离级别
讨论隔离级别的场景,主要是在多个事务并发的情况下
可能出现的问题:
脏读
事务B可能读取了事务A尚未提交的数据
不可重复读
事务A事先读取了数据,事务B紧接了更新了数据,并提交了事务,而事务A再次读取该数据时,数据已经发生了改变。
幻读
事务A读取一次后,事务B插入一行满足事物A的新数据,当事物A再次进行相同的条件查询会看见事物A插入的新数据。
隔离级别解决的问题
读提交:脏读
事务A不能读取事务B已修改但是尚未提交的数据值。(SQL Server , Oracle)
重复读 (MySQL):不可重复读
事务A开始读取后,事务B不能对该记录进行修改 (MySQL)
序列化:幻读
在A事务完成之前,事务B不能向事务A已读取的范围插入新行
索引
常用索引类型
所有数据存储在叶子节点,复杂度为
O(logn)
,适合范围查询。哈希索引
适合等值查询,检索效率高,一次到位。不支持范围查询,模糊查询,
order by
和最左前缀原则全文索引 FULLTEXT
MyISAM
和InnoDB
中都支持使用全文索引,一般在文本类型char, text, varchar
类型上创建。
索引优缺点
- 优点:加速查询,保证唯一性
索引可以加快数据查询速度,减少查询时间,唯一索引可以保证数据库表中每一行的数据的唯一性
- 缺点:创建和维护耗费时间,占用空间
创建索引和维护索引要耗费时间;索引需要占物理空间,除了数据表占用数据空间之外,每一个索引还要占用一定的物理空间;以表中的数据进行增、删、改的时候,索引也要动态的维护。
不适用场景
数据量少
更新比较频繁
区分度低(如性别)
不会被
where、group by、order by
使用到的字段已经有冗余的索引的情况
比如已经有
a,b
的联合索引,不需要再单独建立a
索引
联合索引
索引失效
锁
日志
主从备份
性能优化
Redis和MySQL数据一致性
引擎
InnoDB:MySQL 5.1 后默认的存储引擎,支持事务、支持外键、支持崩溃修复和自增列,数据读写效率一般。
MyISAM:MySQL 5.1 之前默认的数据库引擎,读取效率较高,占用数据空间较少,但不支持事务、不支持行级锁、不支持外键等特性,因此插入时使用表锁,效率较低
MEMORY:读写性能很高,但 MySQL 服务重启之后数据会丢失,它不支持事务和外键