MySQL8.0 入门系列(一)
参考
基础
数据库:将数据按一定格式,进行存储和管理的仓库
数据库分类:
- 关系型:以二维表形式存储,支持事务,支持sql查询,包括MySQL、SQLServer、PostgreSQL、Oracle等
- 非关系型(NoSQL):存储结构灵活,事务支持较弱,并发性能高,大多不支持sql,包括MongoDB(文档存储)、Redis(键值存储)、Apache Cassandra(列存储)和 Neo4j(图数据库)
数据库管理系统(DBMS):用于管理和操作0到多个数据库的软件
数据表:二维表,数据库的存储形式,一个数据库有0到多张表
字段 / 属性:数据表的“列名”,键值对的“键”
记录:表中数据的存储形式,也就是表格的“一行”,一条数据也就是一条记录也就是“一行内容”
主键:特殊的属性,每个表中只有一个主键,唯一地标识出每一条记录。主键可以是单个属性,也可以是多个属性的组合。
外键:特殊的属性,定义两表间的关联关系
索引:对数据库表中一列或多列的值进行排序的一种结构,可以提高查找效率。
事务:定义一个不可分割的操作,有acid特性 - 原子性:要么全成功要么全失败
- 一致性:执行前后数据一致
- 隔离性:事务间相互隔离
- 持久性:事务提交后被持久化到数据库
MySQL是什么?为什么要学?
- MySQL 是一个数据库管理系统
- MySQL 数据库是关系型数据库
- MySQL 软件使用 GPL 许可开源(个人社区版免费,商业版收费)
- MySQL 数据库服务器非常快速、可靠、可扩展且易于使用
- MySQL 服务器工作在客户端/服务器或嵌入式系统中(跨平台)
- 有大量贡献的 MySQL 软件可供使用(生态常用)
如此,不多说直接进入正题
MySQL学习
数据类型
整型
字符串类型
Text,MediumText,LongText 64KB,16MB,4GB
浮点型
时间类型
如下表中之所以字节数不固定,是因为支持0-6位的微秒,每2位占1字节。
数据库逻辑设计
根据所需实现的业务功能,去对数据库进行设计,包括数据库中有什么表,表中有什么字段,字段是什么类型,表之间的关系等等。
范式
- 表中字段不可再分
- 表中存在业务主键,其他属性依赖于这个业务主键
- 表中非主键列不能相互依赖
- ……
反范式化
指不完全满足数据库设计的各个范式,避免过多的表关联,导致性能下降。本质是允许一定的数据冗余,以空间换时间。
数据库物理设计
字段类型选择
- 优先选择符合需求的最小数据类型
- int不够而unsigned int足够时,应选择unsigned int而不是bigint
- ip可以用inet_aton和inet_ntoa函数实现和数字的互转,所以常用unsigned int存储
- 谨慎使用text
- 原因:
- 很多时候varchar足够
- mysql的内存临时表不支持text这样占用比较多的,会用磁盘临时表,性能较差
- 还要二次查询
- 使用:建议存新表,不要select *,只查要查的列
- 原因:
- 谨慎使用enum(update不能,只能alter,短暂阻塞在并发比较大时有风险)
- 财务相关数据存储使用decimal类型
数据库对象命名规则
- 小写字母加下划线
- 不要用mysql保留关键字 见MySQL关键字
- 见名知义
- 尽量小于32字符
- 表名尽量包含数据库名称
- 临时库表尽量以tmp为前缀,日期作后缀
- 备份库表同理bak
- 所有存储相同数据的字段名和数据类型一致
InnoDB
MySQL5.7之后默认的存储引擎,特性如下:(除了5,也是和myisam引擎的区别)
- 支持事务
- 数据按主键聚集存储(叶子结点存的是主键而不是数据位置,主键长度直接关系到查询性能)
- 支持行级锁与MVCC(多版本并发控制)
- 支持Btree和自适应Hash索引
- 支持全文和空间索引(5.6&5.7之后)