逻辑架构
文章插图
MySQL逻辑架构图
- MySQL逻辑架构整体分为三层,最上层为客户层,
- 并非MySQL所独有,诸如,连接处理、授权认证、
- 安全等功能均在这一层处理 。
- MySQL大多数核心服务均在中间这一层,包括查
- 询解析、分析、优化、缓存、内置函数(时间、数学、
- 加密等),所有的跨存储引擎的功能也在这一层实现:
- 存储过程、触发器、视图等 。
- 最下层为存储引擎,其负责MySQL中的数据存储
- 和提取,中间的服务层通过API与存储引擎通信,这
- 些API接口屏蔽了不同存储引擎的差异 。
文章插图
查询过程时序图
存储引擎
文章插图
支持的9种存储引擎
从上图我们可以查看出当前版本的MySQL 默认存储引擎是InnoDB, 其实在5.5版本之前,MyISAM是它的默认引擎,之后是InnoDB 。我们项目用的是8.0.17。
主流的引擎就两种:innodb和myisam
- MyISAM和InnoDB区别
- MyISAM不支持事务,而InnoDB支持 。
- Myisam可以没有主键,InnoDB表必须有主键(用户没有指定的话会自己找或生产一个主键)
- 而 MyISAM表不支持外键,InnoDB支持
- MyISAM锁的粒度是表级,而InnoDB支持行(默认),表级锁 。
- (InnoDB的行锁是实现在索引上的,而不是锁在物理行记录上 。潜台词是,如果访问没有命中索引,也无法使用行锁,将要退化为表锁)
- MyISAM支持全文类型索引,而InnoDB不支持全文索引 。(mysql 5.7后innodb支持全文索引)
- InnoDB不保存表的具体行数,执行select count(*) from table时需要全表扫描 。而MyISAM用一个变量保存了整个表的行数,执行上述语句时只需要读出该变量即可,速度很快(注意不能加有任何WHERE条件)
- 清空整个表时,InnoDB是一行一行的删除,效率非常慢 。MyISAM则会重建表 。
- Innodb存储文件有frm、ibd,而Myisam是frm、myd(my data)、myi(my index)
- Innodb:frm是表定义文件,ibd是数据文件
- Myisam:frm是表定义文件,myd是数据文件,myi是索引文件
- MyISAM相对简单,所以在效率上要优于InnoDB,小型应用可以考虑使用MyISAM 。当你的数据库有大量的写入、更新操作而查询比较少或者数据完整性要求比较高的时候就选择innodb表 。当你的数据库主要以查询为主,相比较而言更新和写 入比较少,并且业务方面数据完整性要求不那么严格,就选择myisam表 。
不要轻易相信“MyISAM比InnoDB快”之类的经验之谈,这个结论往往不是绝对的 。在很多我们已知场景中,InnoDB的速度都可以让MyISAM望尘莫及,尤其是用到了聚簇索引,或者需要访问的数据都可以放入内存的应用 。MYSQL数据类型MySQL支持多种类型,大致可以分为三类:数值、日期/时间和字符串(字符)类型
一般情况下我们选择 InnoDB 都是没有问题的,但是某些情况下你并不在乎可扩展能力和并发能力,也不需要事务支持,也不在乎崩溃后的安全恢复问题的话,选择MyISAM也是一个不错的选择 。但是一般情况下,我们都是需要考虑到这些问题的 。
- 数值类型
文章插图
数值类型
注:
- M 的值跟 int(M) 所占多少存储空间并无任何关系
- TINYINT(M), M默认为4;
- SMALLINT(M), M默认为6;
- MEDIUMINT(M), M默认为9;
- INT(M),M默认为11,其实如果我们明确了无符号,那么可以设置为10,因为少了符号位;
- BIGINT(M),M默认为20.
- M表示最大显示宽度,不是用来限制INT列内保存值的范围的 。建表若设置了zerofill(0填充), 会在数字前面补充0. int(M)的最大值和最小值与UNSIGNED有关
推荐阅读
- MySQL之库操作知识梳理
- 讲真,Redis可以用来做数据库吗?
- 零基础也能看懂!数据仓库与数据库的这几个问题,你能回答出来吗
- MySQL OOM 故障应如何下手
- 如何快速处理mysql连接数占满的问题?
- MySQL用户及权限知识梳理
- Mysql 单表适合的最大数据量是多少?如何优化其性能?
- 从SQL Server到MySQL,四款主流迁移工具到底哪家强
- 巧用SQL拼接语句
- MySQL如何快速插入数据