没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
MySQL夺命连环问 基础 >> 进阶 1. CHAR和VARCHAR的区别? 2. NOW()和CURRENT_DATE()有什么区别? 3. 什么是数据库三范式,如何根据某个场景设计数据表?优缺点? 4. 能说下存储引擎myisam 和 innodb的区别吗? 5. 如何合理设计MySQL表设计 1. 命名规范 2. 选择合适的字段类型 3. 主键设计要合理 4. 选择合适的字段长度 5. 优先考虑逻辑删除,而不是物理删除 6. 每个表都需要添加这几个通用字段如主键、create_time、modifed_time等 7. 一张表的字段不宜过多 8. 尽可能使用not null定义字段 9. 设计表时,评估哪些字段需要加索引 10. 不需要严格遵守 3NF,通过业务字段冗余来减少表关联 11. 避免使用MySQL保留字 12 不搞外键关联,一般都在代码维护 13. 一般都选择INNODB存储引擎 14. 选择合适统一的字符集。 15. 如果你的数据库字段是枚举类型的,需要在comment注释清楚 16.时间的类型选择 17.不建议使用Stored procedure (包括存储过程
资源推荐
资源详情
资源评论
# MySQL 夺命连环问
## 基础 >> 进阶
---
### 1. CHAR 和 VARCHAR 的区别?
**1. char 类型的长度是固定的,varchar 的长度是可变的。**
这就表示,存储字符串'abc',使用 char(10),表示存储的字符将占 10 个字节(包括 7 个空字
符)
使用 varchar(10),则表示只占 3 个字节,10 是最大值,当存储的字符小于 10 时,按照实际的
长度存储。
**2.char 类型的效率比 varchar 的效率稍高**
**3.varchar 与 varchar 的区别**
varchar 是 oracle 开发的一个数据类型。
工业标准的 varchar 可以存储空字符串,oracle 的 varchar 还可以存储 NULL 值,如果想要有
向后兼容的能力建议使用 varchar
**4.varchar 比 char 节省空间,但是在效率上比 char 稍差些。既要获得效率即必须牺牲一点
空间,这就是设计上的""以空间换时间""**
varchar 虽然比 char 节省空间,但是一个 varchar 列经常被修改,而且每次修改的数据长度
不同,这会引起“行迁移的现象”,而这造成的多余的 I/O,是数据库设计中尽量避免的,在
这种情况下使用 char 代替 varchar 会更好些。
### 2. NOW()和 CURRENT_DATE()有什么区别?
NOW()命令用于显示当前年份,月份,日期,小时,分钟和秒。
CURRENT_DATE()仅显示当前年份,月份和日期。
### 3. 什么是数据库三范式,如何根据某个场景设计数据表?优缺点?
>数据库结构优化的目的:
首先要减少数据冗余,冗余指的是相同的数据在多个地方存在,或者说表中的某一个列可以
通过计算得到,减少数据冗余并不是说 就不允许出现数据冗余,因为有些时候数据冗余是必
要的。
**第一范式:数据库表中的所有字段都只有的单一属性 ,每一列都是不可以拆分的。**
>第一范式的合理遵循需要根据系统的实际需求来定。比如某些数据库系统中需要用到“地
址”这个属性,本来直接将“地址”属性设计成一个数据库表的字段就行。但是如果系统经
常会访问“地址”属性中的“城市”部分,那么就非要将“地址”这个属性重新拆分为省份、
城市、详细地址等多个部分进行存储,这样在对地址中某一部分操作的时候将非常方便。这
样设计才算满足了数据库的第一范式
**第二范式:在满足 1NF(第一范式) 的同时,数据表里的非主属性都要和这个数据表的
候选键有完全依赖关系。**
>第二范式在第一范式的基础之上更进一层。第二范式需要确保数据库表中的每一列都和主
键相关,而不能只与主键的某一部分相关(主要针对联合主键而言)。也就是说 在一个数据
库表中,一个表中只能保存一种数据,不可以把多种数据保存在同一张数据库表中。
>
>比如要设计一个订单信息表,因为订单中可能会有多种商品,**所以要将订单编号和商品
编号作为数据库表的联合主键**
**第三范式:在满足 2NF(第二范式) 的同时,模型非主键字段不能相互依赖。**
>比如在设计一个订单数据表的时候,可以将客户编号作为一个外键和订单表建立相应的关
系。而不可以在订单表中添加关于客户其它信息(比如姓名、所属公司等)的字段。
**追问:你们数据库表设计是遵从三范式的吗?**
>**范式化设计的优点**:可以减少数据冗余,数据表体积小更新快,范式化的更新操作比
反范式化更快,范式化的表通常比反范式化更小。
**缺点:**对于查询需要对多个表,会关联多个表,在应用中,进行表关联的成本是很高
更难得进行索引优化
**反范式化设计的优缺点**
可以减少表的关联,可以对查询更好的进行索引优化,缺点,表结构存在数据冗余和数据维
护异常,对数据的修改需要更多资源。
因此在设计数据库结构的时候要将反范式化和范式化结合起来
答:大多数情况下表的设计会遵从三范式来进行设计,但是有些业务场景下,合理使用反范
式设计会减少表的关联查询,提升查询效率。所以项目表设计会将反范式化和范式化结合起
来使用。
### 4. 能说下存储引擎 myisam 和 innodb 的区别吗?
1. InnoDB 支持事务,MyISAM 不支持
2. InnoDB 支持外键,而 MyISAM 不支持
3. InnoDB 是聚集索引,使用 B+Tree 作为索引结构,数据文件是和(主键)索引绑在一起的;
MyISAM 是非聚集索引,它也是使用 B+Tree 作为索引结构,但是索引和数据文件是分离的,
索引保存的是数据文件的指针。
4. InnoDB 必须要有主键,MyISAM 可以没有主键;InnoDB 如果我们没有明确去指定创建主
键索引。它会帮我们隐藏的生成一个 6 byte 的 int 型的索引作为主键索引。
5. InnoDB 辅助索引和主键索引之间存在层级关系;MyISAM 辅助索引和主键索引则是平级关
系。即:InnoDB 如果添加其他辅助索引,辅助索引查询就需要两次查询,先查询到主键,
然后再通过主键查询到数据。因此,主键不应该过大,因为主键太大,其他索引也相应都会
很大
6. InnoDB 不保存表的具体行数,执行 select count(*) from table 时需要全表扫描。而 MyISAM
用一个变量保存了整个表的行数,执行上述语句时只需要读出该变量即可,速度很快(注意
不能加有任何 WHERE 条件);
7. Innodb 不支持全文索引,而 MyISAM 支持全文索引,在全文索引领域的查询效率上 MyISAM
速度更快高;(MySQL 5.7 版本以后,InnoDB 也支持全文索引了
8. InnoDB 支持表级锁、行级锁,默认为行级锁;而 MyISAM 仅支持表级锁。InnoDB 的行
锁是实现在索引上的,而不是锁在物理行上。如果访问未命中索引,也是无法使用行锁,将
会退化为表锁
9. Innodb 存储文件有 frm、ibd,而 Myisam 是 frm、MYD、MYI。【InnoDB 中,.frm 文件:保
存的是表结构定义描述文件;.ibd 文件:保存的是 employee 表中的数据内容】;【MyISAM
中,.frm 文件:保存的是表结构定义描述文件,.MYD 文件:保存的是数据内容,.MYI 文件:
保存的是索引内容】(好像是在 MySQL 8.0 中,.frm 文件已经不存在了,此处以 MySQL5.7
介绍)
**如何选择:**
1. 判断是否需要支持事务,如果要请选择 InnoDB,如果不需要可以考虑 MyISAM;
2. 如果表中绝大多数都只是读,可以考虑 MyISAM,否则 InnoDB。
### 5. 如何合理设计 MySQL 表设计
#### 1. 命名规范
数据库表名、字段名、索引名等都需要命名规范,可读性高(一般要求用英文),让别人一看
命名,就知道这个字段表示什么意思。
* 表名、字段名必须使用小写字母或者数字,禁止使用数字开头,禁止使用拼音,并且一般
不使用英文缩写。
* 主键索引名为 pk_字段名 ;唯一索引名为 uk_字段名 ;普通索引名则为 idx_字段名。
#### 2. 选择合适的字段类型
* 尽可能选择存储空间小的字段类型,就好像数字类型的,从 tinyint、smallint、int、bigint
从左往右开始选择
* 小数类型如金额,则选择 decimal ,禁止使用 float 和 double 。
* 如果存储的字符串长度几乎相等,使用 char 定长字符串类型。
* varchar 是可变长字符串,不预先分配存储空间,长度不要超过 5000 。
* 如果存储的值太大,建议字段类型修改为 text ,同时抽出单独一张表,用主键与之对应。
* 同一表中,所有 varchar 字段的长度加起来,不能大于 65535 . 如果有这样的需求,请
使用 TEXT/LONGTEXT 类型。
#### 3. 主键设计要合理
主键设计的话,最好不要与业务逻辑有所关联。有些业务上的字段,比如身份证,虽然是唯
一的,一些开发者喜欢用它来做主键,但是不是很建议哈。主键最好是毫无意义的一串独立
不重复的数字,比如 UUID ,又或者 Auto_increment 自增的主键,或者是雪花算法生成的
主键等等;
#### 4. 选择合适的字段长度
剩余13页未读,继续阅读
资源评论
飞翔的佩奇
- 粉丝: 6093
- 资源: 1603
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功