高性能mysql学习笔记-第1章-mysql架构与历史
mysql架构与礼视
mysql架构与历史
Mysql 逻辑架构
概括为:
- 连接层
- 服务器层
- 存储殷勤层
连接管理与安全性
每个客户端连接都会在服务器进程中拥有一个线程,这个连接的查询直会在这个单独的线程中执行,该线程只能轮流在某个CPU核心或者CPU中运行。
优化与执行
mysql会解析查询,并创建内部数据结构,然后对其进行各种优化。
并发控制
读写锁
- 读锁(read lock),又称共享锁(shared lock)
- 写锁(write lock),又成排他锁(exclusive lock)
锁粒度
一种提高共享资源并发性的方式就是让锁定对象更有选择性。在给定的资源上,锁定的数据量越少,则系统的并发程度越高。
- 表锁(table
lock):尽管存储引擎可以管理自己的锁,mysql本身还是会使用各种有效的表锁,例如,
ALTER TABLE
之类的语句使用表锁 - 行级锁(row lock):在InnoDB和XtraDB,以及其他的一些存储引擎中实现了行级锁。行级锁只在存储引擎层实现。
事务
可以用START TRANSACTION
开始一个事务,事务内的语句,要么全部执行,那么全部失败。
START TRANSACTION; |
ACID
原子性(atomicity):一个事务必须被视作一个整体
一致性(consistency):数据库总是从一个一致性的状态转换到另一个一致性的状态
隔离性(isolation):通常来说,一个事务所做的修改在最终提交之前,对其他的事务是不可见的
持久性(durability):一旦事务提交,则其所作的修改就永久保存到数据库中
隔离级别
READ UNCOMMITTED(未提交读)
事务中的修改,即使没有提交,对其他事务也都是可见的。事务可以读取未提交的数据,这也被成为脏读(Dirty Read)
READ COMMITTED(提交读)
大多数数据库默认的隔离级别(但mysql不是)。一个事务只能看见已经提交的事务所作的修改。
但是同一个事务中两次执行的查询,可能获取不一样的结果。因为第一个查询结束后,可能别的事务提交了修改。这种称为幻行(Phantom Row)
REPEATABLE READ(可重复读)
mysql的默认事务隔离级别
InnoDB和XtraDB存储引擎通过多版本并发控制(MVCC)解决了幻读问题。
SERIALIZABLE(可串行化)
最高的隔离级别。通过强制事务串行执行,避免了幻读问题。但是有性能问题。只有在非常高需要确保数据一致性而且接受没有并发的情况下,才考虑使用该级别
死锁
死锁是指两个或者多个事务在同一资源上互相占用,并请求锁定对方占用的资源,从而导致恶行循环的现象。
事务日志
mysql中的事务
SHOW VARIABLES LIKE 'AUTOCOMMIT' |
mysql默认采用自动提交模式(AUTOCOMMIT),也就是说,如果不是显式的开始一个事务,则每个查询都被当做一个事务执行提交操作。
多版本并发控制
MVCC具体操作:
- SELECT
- INSERT
- DELETE
- UPDATE
MySQL的存储引擎
SHOW TABLE STATUS
可以查看表的信息
InnoDB
默认事务型引擎。被设计用来处理大量的短期(short-lived)事务
采用MVCC来支持高并发
MyISAM
是InnoDB以前的默认引擎,提供大量的特性,包括全文索引、压缩、空间函数等,但不支持事务和行级锁,而且崩溃后无法安全回复。
内建的其他引擎
- Archive
- Blackhole
- CSV
- Federated
- Memory
- Merge
- NDB集群引擎
选择合适的引擎
转换表的引擎