zoukankan      html  css  js  c++  java
  • "High Performance MySQL"阅读笔记(一)

    在大规模水平集群的架构设计中,开源的MySQL受到的关注度越来越高。

    到2012年整个淘宝网的核心交易系统已经全部运行在基于PC服务器的MySQL数据库集群中。

    一、MySQL架构与历史

    MySQL最重要、最与众不同的特性是它的存储引擎架构,这种架构的设计将查询处理(Query Processing)及其他系统任务(Server Task)和数据的存储/提取相分离。

    这种处理和存储相分离的设计可以在使用时根据性能、特性,以及其他需求来选择数据存储方式。

    1.1 MySQL逻辑架构

    照着书上画的逻辑架构图

    最上层的客户端;

    第二层包含大多数MySQL核心服务功能,包括查询解析、分析、优化、缓存以及所有的内置函数。所有跨存储引擎的功能都在这一层实现:存储过程、触发器、视图等;

    第三层包含了存储引擎。存储引擎不会去解析SQL,不同存储引擎之间也不会相互通信。(InnoDB会解析外键定义,这是一个例外)

    1.1.1 连接管理与安全性

    每个客户端连接都会在服务器进程中拥有一个线程。服务器会缓存线程,因此不需要为每个新建的连接创建或者销毁线程。

    1.1.2 优化与执行

    MySQL会解析查询,并创建内部数据结构(解析树),然后对其进行各种优化,包括重写查询、决定表的读取顺序,以及选择合适的索引等。用户可以通过特殊的关键字提示(hint)优化器,影响它的决策过程。也可以请求优化器解释(explain)优化过程的各个因素,使用户可以知道服务器是如何进行优化决策的,并提供一个参考基准,便于用户重构查询和schema、修改相关配置,使应用尽可能高效运行。

    对于SELECT语句,在解析查询前,服务器会先检查查询缓存(Query Cache),如果能够在其中找到对应的查询,服务器就不必再执行查询解析、优化和执行的整个过程,而是直接返回查询缓存中的结果集。(详见第7章)

    1.2 并发控制

    1.2.1 读写锁

    共享锁(shared lock) 和排他锁(exclusive lock),也叫读锁和写锁。

    1.2.2 锁粒度

    由于加锁也要消耗资源,所以理想方式是精确的锁定。

    所谓锁策略,就是在锁的开销和数据的安全性之间寻求平衡。

    MySQL支持多个存储引擎的架构,每种MySQL存储引擎都可以实现自己的锁策略和锁粒度。

    两种重要的锁策略:表锁(table lock)和行级锁(row lock)

    服务器会为诸如ALTER TABLE之类的语句使用表锁,而忽略存储引擎的锁机制。

    InnoDB和XtraDB,以及其它一些存储引擎中实现了行级锁(行级锁只在存储引擎层实现,服务器层没有实现)。

    1.3 事务

    事务就是一组原子性的SQL查询,或者说一个独立的工作单元。

    START TRANSACTION

    ...

    COMMIT;

    事务的特性ACID(atomicity,consistency,isolation,durability)

    1.3.1 隔离级别

    ANSI SQL隔离级别

    未提交读,事务可以读取未提交的数据,被称为脏读。

    提交读,大多数数据库系统的默认隔离级别。有时也叫做不可重复读,因为两次执行相同的查询,可能会得到不一样的结果。

    可重复读,理论上无法解决幻读(Phantom Read)。所谓幻读,指某个事务在读取某个范围的记录时,另一个事务又在该范围内插入了新的记录,当之前的事务再次读取该范围内的记录时,会产生幻行。

                       InnoDB和XtraDB存储引擎通过多版本并发控制(MVCC)解决了幻读,可重复读是MysSQL默认隔离级别。

    可串行化,强制事务串行执行。

    1.3.2 死锁

    死锁是指两个或多个事务在同一资源上相互占用,并请求对方占用的资源,从而导致恶性循环的现象。

    InnoDB目前处理死锁的方式是,将持有最少行级排他锁的事务进行回滚(这是相对比较简单的死锁回滚算法)。

    以同样的顺序执行语句,有些存储引擎会产生死锁,有些则不会。

    1.3.3 事务日志

    1.3.4 MySQL中的事务

    MySQL提供了两种支持事务的存储引擎:InnoDB和NDB Cluster.

    InnnoDB采用的是两阶段锁定协议。

    MySQL也支持LOCK TABLES 和UNLOCK TABLES,这是在服务器层实现的。

    1.4 多版本并发控制(MVCC)

    可以认为MVCC是行级锁的一个变种,它在大多数情况下避免了加锁,因此开销更低。虽然实现机制有所不同,但大都实现了非阻塞的读操作,写操作也只锁定必要的行。

    MVCC是通过保存数据在某个时间点的快照来实现的,典型的有乐观并发控制和悲观并发控制。

    MVCC只在REPEATABLE和READ COMMITTED两个隔离级别下工作。

    1.5 MySQL的存储引擎

    InnoDB基于聚簇索引建立。

    转换表的引擎有三种方式:

    1)ALTER TABLE

    ALTER TABLE mytable ENGINE = InnoDB;

    2) 导出与导入

    3)创建与查询(CREATE和SELECT)

  • 相关阅读:
    mabatis的批量新增sql 初级的 初级的 初级的
    (批量更新)对多个符合条件的id做更新操作
    js中的 !! 和 ! 的区别
    js中===和==的区别
    select下拉框使用完毕后,重置按钮使其清空
    select下拉框的数据回显
    字符串拼串 能缓解我们的开发难度→!←(ε=(´ο`*)))唉,又是一个不知道该怎么写题目的随笔啊,头疼)
    select下拉框可以直接取list里的内容 不用非得转map (不得不承认我是个ZZ,这么简单的问题才反应过来,--^--)
    sql中某条件不为空,可能有的小祖宗会喷了,这还用总结?emmm,我渣,我觉得有一点意思对于第二种(土味)
    左查询left join on简单总结
  • 原文地址:https://www.cnblogs.com/jdbc2nju/p/10848422.html
Copyright © 2011-2022 走看看