MySQL高级应用——基础篇
MySQL架构原理
这里不是MySQL入门教程,如果没有MySQL基础,请先学习MySQL基础以后再来学习这里的内容。今天的第一篇先从基础的开始。
1. MySQL架构模式的演变
单实例架构模式
该模式就是只部署1台数据库实例
缺点:
1. 数据访问量太大,超出一台服务器承受极限
2. 读写操作量太大,超出一台服务器承受极限
3. 一台服务器挂了,应用也挂了
优点:
1. 简单快速
主从架构模式
缺点:
1. 数据量太大,超出一台服务器承受极限
2. 写操作太大,超出一台master服务器承受极限
优点:
1. 读写分离
2. 容灾性能比单实例要好一些
分库分表架构模式
缺点:
1. 架构复杂
2. 数据访问路由规则复杂
3. 数据一致性保证难度大
优点:
1. 水平分解数据库,分解后的数据库内部也形成集群
2. 解决数据量太大导致数据库无法承受的问题
云数据库架构模式
缺点:
1. 可自定义性较弱,无法根据自己企业需求定制化
优点:
1. 使用简单
2. 安全问题由云服务商负责
3. 弹性的性能
4. 配套服务全面
2. MySQL常用基础指令
错误日志:
mysql>
show variables like '%log_err%';
常规日志:
mysql>
show variables like '%general%';
二进制日志:不记录数据库查询操作,只记录修改操作,可用于数据库恢复。
mysql>
show variables like '%log_bin%';
mysql>show variables like '%binlog%';
mysql>show binary logs;
慢查询日志:记录所有执行时间超时的查询SQL,默认超时时间:10秒
// 是否开启慢查询日志
mysql>show variables like '%slow_query%';
// 查询慢查询超时时长
mysql>show variables like '%long_query_time%';
// 修改慢查询超时时长
mysql>set long_query_time = 5;
查询数据库保存路径
mysql>
show variables like '%datadir%';
查询数据库的进程信息
mysql>
show processlist;
mysql>show full processlist;
查询数据库查询缓存配置
mysql>
show variables like '%query%';
mysql>show status like 'Qcache%';
查看MySQL查询引擎配置
mysql>
show engines;
3. InnoDB和MyISAM主要区别
InnoDB和MyISAM是使用MySQL时最常用的两种引擎类型,他们最主要的区别如下:
事务和外键
InnoDB:支持事务和外键,具有安全性和完整性,适合大量insert或update操作
MyISAM:不支持事务和外键,它提供高速存储和检索,适合大量的select查询操作
锁机制
InnoDB:支持行级锁,锁定指定记录。基于索引来加锁实现。
MyISAM:支持表级锁,锁定整张表。
索引结构
InnoDB:使用聚集索引(聚簇索引),索引和记录在一起存储,既缓存索引,也缓存记录。
MyISAM:使用非聚集索引(非聚簇索引),索引和记录分开。
并发处理能力
InnoDB:读写阻塞与事务隔离级别有关,可以采用多版本并发控制(MVCC)来支持高并发。
MyISAM:使用表锁,会导致写操作并发率低,读之间并不阻塞,读写阻塞。
存储文件
InnoDB:表对应两个文件,一个.frm表结构文件,一个.ibd数据文件。InnoDB表最大支持64TB;
MyISAM:表对应三个文件,一个.frm表结构文件,一个.myd表数据文件,一个.myi索引文件。从MySQL5.0开始默认限制是256TB。
两种引擎的适用场景
【MyISAM】
- 不需要事务支持(不支持)
- 并发相对较低(锁定机制问题)
- 数据修改相对较少,以读为主
- 数据一致性要求不高
【InnoDB】
- 需要事务支持(具有较好的事务特性)
- 行级锁定对高并发有很好的适应能力
- 数据更新较为频繁的场景
- 数据一致性要求较高
- 硬件设备内存较大,可以利用InnoDB较好的缓存能力来提高内存利用率,减少磁盘IO
【总结】
两种引擎该如何选择?
场景问题 | 推荐 |
---|---|
是否需要事务? | 需要-InnoDB / 不需要-MyISAM |
是否存在并发修改? | 存在-InnoDB / 不存在-MyISAM |
是否追求快速查询且数据修改少? | 是-MyISAM / 否-InnoDB |
通常情况下的默认引擎推荐? | InnoDB |
引擎支持特性如下:
原文出处 https://dev.mysql.com/doc/refman/8.0/en/storage-engines.html
Feature | MyISAM | Memory | InnoDB | Archive | NDB |
---|---|---|---|---|---|
B-tree | indexes | Yes | Yes | Yes | No |
Backup/point-in-time recovery (note 1) | Yes | Yes | Yes | Yes | Yes |
Cluster database support | No | No | No | No | Yes |
Clustered indexes | No | No | Yes | No | No |
Compressed data | Yes (note 2) | No | Yes | Yes | No |
Data caches | No | N/A | Yes | No | Yes |
Encrypted data | Yes (note 3) | Yes (note 3) | Yes (note 4) | Yes (note 3) | Yes (note 3) |
Foreign key support | No | No | Yes | No | Yes (note 5) |
Full-text search indexes | Yes | No | Yes (note 6) | No | No |
Geospatial data type support | Yes | No | Yes | Yes | Yes |
Geospatial indexing support | Yes | No | Yes (note 7) | No | No |
Hash indexes | No | Yes | No (note 8) | No | Yes |
Index caches | Yes | N/A | Yes | No | Yes |
Locking granularity | Table | Table | Row | Row | Row |
MVCC | No | No | Yes | No | No |
Replication support (note 1) | Yes | Limited (note 9) | Yes | Yes | Yes |
Storage limits | 256TB | RAM | 64TB | None | 384EB |
T-tree indexes | No | No | No | No | Yes |
Transactions | No | No | Yes | No | Yes |
Update statistics for data dictionary | Yes | Yes | Yes | Yes | Yes |
InnoDB引擎存储结构
https://dev.mysql.com/doc/refman/8.0/en/innodb-architecture.html
显示innodb引擎信息:
mysql>
show engine innodb status;
mysql>
show variables like '%innodb_page_size%';
(页大小字节数)
mysql>select @@innodbe_page_size;
(页大小字节数)
mysql>select @@innodbe_page_size/1024;
(页大小KB数)
mysql>
show variables like '%innodb_old%';
(字节数)
读缓冲区配置
mysql>
show variables like '%innodb_buffer%';
(Buffer Pool大小)
innodb_buffer_pool_size可调整为物理内存的60~80%容量,innodb_buffer_pool_instances可以设置为多个,这样可以避免缓存争夺。
Page -> chunk -> Buffer Pool
写缓冲区配置
ChangeBuffer占用BufferPool空间,默认占25%,最大允许占50%,可以根据读写业务量来进行调整。参数innodb_change_buffer_max_size;
mysql>
set global innodb_change_buffer_max_size=20;