MySQL
存储引擎:
存储引擎:
InnoDB(聚簇索引) 支持事务、外键、行锁
MyISAM(非聚簇索引) 支持表锁,访问快
Memory 存在内存中
区别:
InnoDB有三大特性,分别是事务、外键、行级锁,这些都是MyIsAm不支持的
InnoDB是聚簇索引,MyISAM是非聚簇索引
MyISAM支持全文索引,innodb 从1.2.x 开始才增加了全文索引支持。而MySQL5.6版本中innodb的版本才升级到 1.2.x。
非聚集索引与聚集索引的区别
聚簇索引的叶子节点就是数据节点,而非聚簇索引的叶子节点存储该数据地址,想要查找数据我们还需要根据地址再去查询数据,这个再地址查找数据的过程,我们称为回表。
mysql事务特性
A原子性:一个事务内的操作统一成功或失败(由undolog日志保证,他记录了需要回滚的日志信息,回滚时撤销已执行的sql)
C一致性:事务前后的数据总量不变(例如转账)
I隔离性:事务与事务之间相互不影响(由MVCC保证)
D持久性:事务一旦提交发生的改变不可逆(由redolog日志和内存保证,mysql修改数据时内存和redolog会记录操作,宕机时可恢复)
事务开始 -> undolog、redolog -> 事务提交:binlog
事务的隔离级别
读未提交:允许读取尚未提交的数据变更。可能会导致脏读、幻读或不可重复读。
读已提交:允许读取已经提交的数据。可能会导致幻读和不可重复读。
可重复读:对同一字段的多次读取结果都是一致的,除非数据是被本身事务自己所修改。可能会导致幻读。
可串行化:最高隔离级别。
MVCC只在Read Committed和Repeatable Read两个隔离级别下起作用,因为Read UnCommitted隔离级别下,读写都不加锁,Serializable隔离级别下,读写都加锁,也就不需要MVCC了
InnoDB 默认隔离级别为可重复读级别,分为快照度和当前读,并且通过间隙锁解决了幻读问题
MVCC
MVCC(Multi-Version Concurrency Control)即多版本并发控制。MVCC 是一种并发控制的方法,一般在数据库管理系统中,实现对数据库的并发访问。
MVCC 使用了一种不同的手段,每个连接到数据库的读者,在某个瞬间看到的是数据库的一个快照,写者写操作造成的变化在写操作完成之前(或者数据库事务提交之前)对于其他的读者来说是不可见的。
例如:如果有人从数据库中读数据的同时,有另外的人写入数据,有可能读数据的人会看到『半写』或者不一致的数据。有很多种方法来解决这个问题,叫做并发控制方法。最简单的方法,通过加锁,让所有的读者等待写者工作完成,但是这样效率会很差。MVCC 使用了一种不同的手段,每个连接到数据库的读者,在某个瞬间看到的是数据库的一个快照,写者写操作造成的变化在写操作完成之前(或者数据库事务提交之前)对于其他的读者来说是不可见的。
快照读和当前读
快照读读取的是当前数据的可见版本,可能是会过期数据,不加锁的select就是快照都
当前读读取的是数据的最新版本,并且当前读返回的记录都会上锁,保证其他事务不会并发修改这条记录。如update、insert、delete、select for undate(排他锁)、select lockin share mode(共享锁) 都是当前读
MySQL有哪些索引
主键索引(PRIMARY KEY):一张表只能有一个主键索引,主键索引列不能有空值和重复值
唯一索引(UNIQUE):唯一索引不能有相同值,但允许为空
普通索引(INDEX):允许出现重复值
组合索引(INDEX):对多个字段建立一个联合索引,减少索引开销,遵循最左匹配原则
全文索引(FULLTEXT):myisam、Memory引擎支持,通过建立倒排索引提升检索效率,广泛用于搜索引擎 MySQL5.6开始innodb也支持
哪些字段适合创建索引
频繁查询的字段
区分度高的字段:
有序的字段:有序的字段在插入数据库的过程中,仍能保持B+树的索引结构,不需要频繁更新索引文件,性能更好。
where和on条件出现的字段:因为查询SQL会先匹配on和where条件的字段
哪些字段不适合创建索引
区分度低的字段
频繁更新的字段:更新字段的过程中,需要维护B+树结构,会频繁更新索引文件,降低SQL性能
过长的字段:过长的字段会占用更多的空间,不适合创建索引
无序的字段:无序的字段在插入数据库的过程中,为了维护B+树索引结构,需要频繁更新索引文件,性能较差
索引失效场景
数据类型隐式转换
索引字段计算
索引字段使用函数
or前后没有同时使用索引
联合索引,没有遵循最左前缀匹配原则(MYSQL 8.0开始增加了索引跳跃扫描,)
优化器选错索引
模糊查询%开头