高性能MySQL学习笔记!
目录
一、MySQL逻辑架构
1. 架构图
第一层:连接/线程处理部分
负责和客户端建立连接,获取用户权限以及维持和管理连接。大多数基于网络的客户端/服务器的工具或服务都有类似架构,比如连接处理、授权认证、安全等等。
第二层:MySQL核心服务功能
包括查询解析、分析、优化、缓存以及所有的内置函数(时间、数学、加密、日期等),所有的跨存储引擎功能都在这层实现。
(1). 查询缓存
查询时,会优先在查询缓存中查询,是否执行过相关sql。没有的话,再走正常的执行流程。但是因为在查询涉及到的表被更新时,缓存就会被清空。所以适用于静态表。
(2). 解析器
判断语句是否符合 MySQL 语法。
(3). 优化器
MySQL解析查询后,创建内部数据结构(解析树),然后对它进行各种优化:重写查询、决定表的读取顺序,选择合适的索引等。我们可以通过关键字(hint)查询优化器提示来提示优化器,并影响它的决策。
优化器并不关心表使用什么存储引擎,但存储引擎会影响优化查询。优化器会请求存储引擎提供容量或某个具体操作的开销信息以及表数据的统计信息等。
第三层:存储引擎
存储引擎负责MySQL中的数据存储和提取,每个存储引擎都有自己的优势劣势,服务器通过API与存储引擎通信,但大部分存储引擎不会解析SQL(InnoDB会解析外键定义),不同的存储引擎之间也不会相互通信,只简单地响应上层服务器请求。
2. 读写锁
在处理并发读或者写时,可以通过实现一个由两种类型的锁组成的锁系统来解决问题。通常这两种锁被称为共享锁和排他锁,也叫读锁和写锁。
读锁:是共享的,相互不阻塞。多个客户在同一时刻可以读取同一资源,互不干扰。
写锁:排他,一个写锁会阻塞其他的写锁和读锁。
3. 锁粒度
一种提高共享资源并发性方式是让锁定对象更有选择性。由于加锁也需要消耗资源,获得锁、检查锁是否解除、释放锁等锁操作,都会增加系统的开销。
每种MySQL存储引擎都可以实现自己的锁策略和锁粒度,以下是两种最重要的锁策略:
表锁:(table lock)
开销最小的策略,它会锁定整张表。一个用户在对表读写前,需要先获得写锁,这会阻塞其他用户对该表的所有读写操作。写锁比读锁有更高的优先级,因此一个写锁请求可能会被插入到读锁队列的前面。
行级锁: (row lock)
行级锁可以最大程度地支持并发处理,同时也是最大的锁开销。在InnoDB和StraDB,以及其他一些存储引擎中实现了行级锁。行级锁只能在存储引擎层实现,MySQL服务器层没有实现。