《高性能Mysql》学习笔记(1) - Mysql 架构与历史

1 eposide 1: Mysql 架构与历史

1.1 逻辑架构

mysql的逻辑架构可以分成

  • 连接层:主要处理连接处理,授权认证,安全等,类似线程连接池
  • 服务层:包括 查询缓存,解析器,优化,以及所有的内置函数,所有跨存储引擎的功能都在这一层实现:存储过程,触发器,视图等等
  • 存储引擎层:复制mysql中数据的存储和提取。存储引擎中会封装各种各样的API来获取数据,存储引擎不会去解析SQL。

image-20260329175030436

  1. 连接管理与安全性

每个客户端连接都会在mysql服务器中拥有一个线程,查询只会在这个单独的线程中执行,服务器负责缓存线程。

当客户端连接到mysql服务器时,服务器需要对其先认证。认证基于用户名,原始主机信息和密码。如果使用了安全套接字SSL,还可以使用X.509证书认证。当连接成功后,服务器会继续验证客户端是否具有执行某个查询的权限。

1.2 选择合适的存储引擎

前面存储引擎的已经说了很多了,直接介绍存储引擎怎么选择

如果不是特定需求,都应该选择InnoDB存储引擎,不推荐混合使用多种存储引擎

考虑角度如下

  1. 事务:
    • Innodb是最稳定支持事务的存储引擎
  2. 备份:
    • Innodb支持热备份
  3. 崩溃恢复
    • Myisam崩溃后发生损坏的概率比InnoDB高很多,恢复速度慢。应该优先选择Innodb
  4. 特有性质
    • 地理空间搜索
    • ....

对于只负责读取的数据表,选择myisam是不错的选择,如果你能接受myisam的崩溃恢复问题。

  1. Myisam 支持压缩表(mysql8.0后移除)
    • 压缩表可以极大地减少磁盘空间占用,因此也可以减少磁盘IO,但是压缩表是不能进行修改的

1.3 转换表的存储引擎

1. 通过Alter Table 语句修改表的存储引擎

例如ALTER TABLE mytable ENGINE = InnoDB;

转换存储引擎会导致

  1. 大量的IO操作和锁
    • 因为存储表的结构发生了变化,数据需要负责到一张新的表中,这就涉及大量IO 和锁
  2. 原先的表的特性可能会丢失
    • 例如 Innodb支持外键,如果转换成Myisam,外键将会丢失

2. 导出和导入

可以使用mysqldump工具将数据导出到文件,如何修改文件种的CREATE TABLE语句的存储引擎选项。

3.INSERT ... SELECT 语法

先创建与一个新的存储引擎的表,然后通过INSERT.... SELECT语句来导数据

CREATE TABLE INNODB_TABLE LIKE myisam_table;
ALTER TABLE innodb_table ENGINE=InnoDB;
INSERT INTO innodb_table SELECT * FROM myisam_table

数据量小的时候,这样就可以,当数据量大了,还可以分批处理。

posted @ 2026-05-01 18:18  不会coding的喵酱  阅读(7)  评论(0)    收藏  举报