C/S工作模型
客户端连接到MySQL服务端的两种方式:
-
本地socket连接方式,只能在本地使用,不依赖于IP和端口:
socket=/tmp/mysql.sock
mysql -s /tmp/mysql.sock -
远程tcp/ip连接方式
mysql -uroot -p123 -h127.0.0.1 -P3306
服务器端实例
一个MySQL实例:mysqld服务进程+一堆工作线程+预分配的内存
从而达到管理数据的目的
类似于一个企业:老板+工人+办公室
mysqld程序结构
show processlist; // 查询mysql的所有客户端连接
MySQL逻辑结构(操作对象)
Linux
目录:名字+属性
文件:文件名+属性+内容
MySQL
库:库名+属性
表:表名+属性+内容(列)
show databases; // 查询mysql的所有数据库
use database_name; // 使用某个数据库
show tables; // 查询当前库的所有表
desc table_name; // 表的列定义
MySQL物理存储结构
磁盘和文件系统
磁盘结构:
磁头、磁盘面、柱面、磁道
扇区:一段连续的磁盘空间(连续是为了保证顺序IO),每个扇区通常是512B。扇区是磁盘的最小组成单元。
磁盘结构这样组织是为了提升磁盘的读取效率。
操作系统的文件系统:对磁盘空间进行进一步的组织利用。
文件系统的块(block):通常是4KB(不同的文件系统有所不同),连续的8个扇区。块是操作系统针对磁盘读写的最小单元。(为什么需要块这个概念?因为扇区的空间太小了,扇区数目多时,空间分散,读取效率比较低。操作系统使用多个连续的扇区构成块,能进一步提升效率)
其实块和簇可以理解成同一种东西,都表示若干个连续的扇区,操作系统读写的最小单元。通俗来讲,在Windows下如NTFS等文件系统中叫做簇;在Linux下如Ext4等文件系统中叫做块(block)。
页(page):是操作系统操作内存的最小单元。操作系统经常与内存、磁盘这两种存储设备进行通信,类似于“块”的概念,都需要一种虚拟的基本单位。所以,与内存操作,是虚拟出一个页的概念来作为最小单位。与硬盘打交道,就是以块为最小单位。
一般来说,扇区空间 <= 块/簇的空间 <= page的空间。
MySQL存储引擎层
存储引擎相当于MySQL的文件系统,在操作系统的文件系统之上又对磁盘空间进行了进一步的组织和利用。
MySQL的页(page):一个page通常是16KB,连续的4个块。是MySQL的最小IO单元。
MySQL的区/簇(extent):一个区通常是连续的64个page,1M的大小。
MySQL的表/段:多个区构成(可以是不连续的区了),一个表就是一个段。
一切都是为了划分成连续的磁盘空间,顺序IO。
sql的优化到最底层就相当于磁盘IO的优化。