Mysql基础知识
1. MySql是什么
MySql是一个关系型数据库管理系统,由瑞典MySql AB公司开发,属于Oracle旗下产品。MySql是最流行的关系型数据库管理系统之一,在WEB应用方面,MySql是最好的RDBMS(Relational Database Management System)应用软件之一。在Java企业级开发中非常常用,因为MySql是开源免费的,并且方便扩展。
2. 数据库设计的三大范式
2.1. 第一范式
每一列都不可再拆分。
用户表:
id | name | phone |
---|---|---|
1 | 李四 | 123456 |
2 | 张三 | 17856756756 |
用户表的设计就不符合第一范式,字段phone可拆分为手机号或者座机号。
2.2. 第二范式
在第一范式的基础之上,非主键列完全依赖于主键列,而不能只依赖于主键列的一部分。
订单信息表
订单编号 | 商品编号 | 商品名称 | 数量 | 单位 | 价格 | 客户 | 所属单位 | 座机号 |
---|---|---|---|---|---|---|---|---|
001 | 1 | 挖掘机 | 1 | 台 | 1200000¥ | 张三 | 上海玖智 | 020-12345670 |
002 | 2 | 冲击钻 | 8 | 把 | 230¥ | 张三 | 上海玖智 | 020-1234567 |
订单信息表设计就不符合第二范式,订单信息表的主键由订单编号及商品编号组成的联合主键,商品名称、数量、单位、价格只与商品编号有关,因此不符合第二范式。
可以将订单信息表拆分为订单表和商品表,订单表中增加商品编号作为外键与商品表关联。
商品表:
商品编号 | 商品名称 | 数量 | 单位 |
---|---|---|---|
1 | 挖掘机 | 1 | 台 |
2 | 冲击钻 | 8 | 把 |
订单表:
订单编号 | 客户 | 所属单位 | 座机号 | 商品编号 |
---|---|---|---|---|
001 | 张三 | 上海玖智 | 020-12345670 | 1 |
002 | 张三 | 上海玖智 | 020-1234567 | 2 |
2.3. 第三范式
在第二范式的基础之上,非主键只依赖于主键列,而不能依赖于其他非主键列。
订单表
订单编号 | 订单项目 | 负责人 | 业务员 | 订单数量 | 客户编号 | 客户名称 | 客户座机号 |
---|---|---|---|---|---|---|---|
001 | 挖掘机 | 刘明 | 020-12345670 | 1 | 1 | 李聪 | 021-1565448 |
002 | 张三 | 上海玖智 | 020-1234567 | 2 | 2 | 李新明 | 021-1565345 |
定单表就不符合第三范式,客户名称、客户座机号不依赖于主键(订单编码)而是依赖于非主键(客户编号)。
可以将订单表拆分为订单表与客户表,订单表中增加客户编号作为外键关联客户表。
订单表
订单编号 | 订单项目 | 负责人 | 业务员 | 订单数量 | 客户编号 |
---|---|---|---|---|---|
001 | 挖掘机 | 刘明 | 020-12345670 | 1 | 1 |
002 | 张三 | 上海玖智 | 020-1234567 | 2 | 2 |
客户表
客户编号 | 客户名称 | 客户座机号 |
---|---|---|
1 | 李聪 | 021-1565448 |
2 | 李新明 | 021-1565345 |
在设计数据库时,要尽量遵守三范式,但是一般在设计时考虑到性能,及查询的方便,设计的表结构都不太符合三范式。
3. Binlog的三种模式
3.1 Statement模式(默认)
每一条会修改数据的Sql语句都会被记录到binlog中。
优点:
缺点
3.2 Row模式
3.3 Mixed模式
4. Mysql的数据类型
5. Mysql的存储引擎
6. Mysql的索引
7. Mysql的事务
8. Sql的优化
sql优化的主要思路就是查看sql是否使用了索引,避免全面扫描。可以使用explain关键字查看sql的执行过程。
下面8条是sql优化思路:
(1). 避免全表扫描,在where、order by、join on后面的字段增加索引。
(2). 尽量避免使用!=或<>,可能会导致全表扫描。
(3). 尽量避免使用in、not in,可能会导致全表扫描。
(4). 尽量避免使用or,可能导致全表扫描。只有or的所有字段都加上了索引,才会使用索引。
(5). 尽量避免使用is null,会导致全表扫描。
(6). like (模糊查询)字段前不能加%,会导致全表扫描,比如 a like ‘%hyc’
(7). where后面字段不能使用算术表达式或函数,“=”号的右边不能使用算术表达式或函数。
(8). 不要使用count(*),会导致全表扫描。