高性能mysql学习笔记-第1章-mysql架构与历史

mysql架构与礼视

mysql架构与历史

Mysql 逻辑架构

概括为:

  • 连接层
  • 服务器层
  • 存储殷勤层

连接管理与安全性

每个客户端连接都会在服务器进程中拥有一个线程,这个连接的查询直会在这个单独的线程中执行,该线程只能轮流在某个CPU核心或者CPU中运行。

优化与执行

mysql会解析查询,并创建内部数据结构,然后对其进行各种优化。

并发控制

读写锁

  • 读锁(read lock),又称共享锁(shared lock)
  • 写锁(write lock),又成排他锁(exclusive lock)

锁粒度

一种提高共享资源并发性的方式就是让锁定对象更有选择性。在给定的资源上,锁定的数据量越少,则系统的并发程度越高。

  • 表锁(table lock):尽管存储引擎可以管理自己的锁,mysql本身还是会使用各种有效的表锁,例如,ALTER TABLE之类的语句使用表锁
  • 行级锁(row lock):在InnoDBXtraDB,以及其他的一些存储引擎中实现了行级锁。行级锁只在存储引擎层实现。

事务

可以用START TRANSACTION开始一个事务,事务内的语句,要么全部执行,那么全部失败。

START TRANSACTION;
SELECT * FROM xxxxxxx;
UPDATE yyyyy SET a = x;
COMMIT;

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集群引擎
  • 选择合适的引擎

  • 转换表的引擎

MySQL时间线(Timeline)

MySQL的开发模式

总结