数据库基础

本贴最后更新于 2487 天前,其中的信息可能已经时移世易

三大范式:

  • 每列保持原子性,不可拆分
  • 每列都和主键有关,而不能只与主键的某一部分相关(主要针对联合主键而言)
  • 每列都和主键直接相关,而不是间接相关

数据库引擎 InnoDB 和 MyISAM 的区别

  1. 事务处理:MyISAM 注重性能,执行速度比 InnoDB 快,但是不支持事务处理(也
    没有外键)。
  2. 物理构成:每个 MyISAM 在磁盘上存储成三个文件,.frm 表定义,.MYD 数据文件,
    .MYI 索引文件。InnoDB 只有数据文件和日志文件,InnoDB 表的大小只受限于操作
    系统文件的大小。
  3. 增删改查:如果执行大量的 SELECT,MyISAM 是更好的选择。而如果执行大量的
    INSERT 或 UPDATE,InnoDB 表在性能上更加出色。DELETE 时 InnoDB 不会重新建
    立表,而是一行一行的删除。InnoDB 不支持外部导入数据(load table)。
  4. 自增:对于设置为自增的字段,InnoDB 中必须包含只有该字段的索引,但是在
    MyISAM 表中,可以和其他字段一起建立联合索引。
  5. 行数:MyISAM 会记录表的行数,所以在 select count(*) from table,MyISAM 只要
    简单的读出之前保存好的行数即可,InnoDB 不保存,需要扫描一遍整个表来计算有
    几行。当然,有 where 子句的时,2 种表的操作时一样的。
  6. 锁:MyISAM 只支持表级锁,不支持行级锁。

四种锁机制

  • 共享锁(S 锁),事务对数据对象加 S 锁之后,其他事务就只能读取这个对象,无法对这个对象做任何修改。
  • 排它锁(X 锁),事务对数据对象加 X 锁之后,其他事务无法读取或操作这个对象。
  • 悲观锁:锁住读取的记录,防止其它事务读取和更新这些记录。其它事务会一直阻塞,直到这个事务结束。
  • 乐观锁:不会锁住任何东西,但有可能会造成脏数据被更新到数据库中

事务四大特性

  • 原子性(业务操作单元)
  • 一致性(ATM 取钱)
  • 隔离性(二元世界)
  • 持久性(不可逆操作)

脏读、不可重复读与幻读

  • 脏读:当一个事务正在访问数据,并且对数据进行了修改,而这种修改还没有提交到数据库中,这时,另外一个事务也访问这个数据,然后使用了这个数据
  • 不可重复读:在一个事务内,多次读同一数据,并且在 2 次读取之间另外一个事务修改了这个数据,那么就导致在一个事务内两次读到的数据是不一样的
  • 幻读:这是一种当事务不是独立执行时会发生的现象。例如:一个事务对一个表中的所有数据进行了修改,同时另外一个事务向表中插入了一条数据。那么操作第一个事务的用户发现表中还有没有修改的数据行,就好象发生了幻觉一样
事务隔离级别 脏读 不可重复读 幻读
Read Uncommitted y y y
Read Committed n y y
Repeatable Read(悲观锁级别) n n y
Serializable n n n

视图的特点与应用场景

一般用于控制权限的地方,或者用于查询的某些地方,特点如下:
  1. 视点集中
    使用户只关心它感兴趣的某些特定数据和他们所负责的特定任务,同样提高了数据的安全性。
  2. 简化操作
    向用户隐藏了表与表之间的复杂的连接操作,不必重新写这些复杂的查询语句,只要一条简单的查询视图语句即可。
  3. 定制数据
  4. 合并分割数据
  5. 安全性

GUID 和 Int 作为主键谁更合适?

  1. guid16B,int4B,int 占用存储空间小
  2. guid 是独一无二基本不会重复,int 数据合并时会出现主键重复的情况
  3. int 有内置函数获取最新的值,如 Scope_Indentity,guid 没有这样的方法
  4. int 容易记忆,join 操作性能更好
  5. guid 做主键索引时会降低性能
  6. 如果项目存在数据迁移的情况,使用 guid,不然使用 int

varchar 和 varchar2 有什么区别?

  1. varchar2 把所有字符都占两字节处理(一般情况下),varchar 只对汉字和全角等字符占两字节,数字,英文字符等都是一个字节;
  2. VARCHAR2 把空串等同于 null 处理,而 varchar 仍按照空串处理;
  3. VARCHAR2 字符要用几个字节存储,要看数据库使用的字符集,
    大部分情况下建议使用 varchar2 类型,可以保证更好的兼容性。

truncate drop delete 区别

  1. truncate drop 是数据定义语言(DDL),执行后会自动提交,delete 语句可以回滚。
  2. truncate 和 delete 只删除数据,不删除表结构。执行 drop 操作后,将删除表结构和依赖于此表的约束、触发器、索引
  3. 速度上,drop>truncate>delete
  4. 一般来说删除数据用 delete,删除表用 drop,删除所有数据但保留表结构用 truncate。

truncate table 与不带 where 子句的 delete 的区别

他们功能相同,但是 truncate 更快,truncate 之后计数值重置,truncate 不会激活触发器,如果表有视图,无法用 truncate 删除

4 种语言类型:

  • DDL:Data Definition Language,数据库模式定义语言
    关键字:create,truncate,drop,alter

  • DML:Data Manipulation Language,数据操纵语言
    关键字:update、insert、delete

  • DCL:Data Control Language,数据控制语言
    关键字:grant、revoke、commit、rollback

  • DQL:Data Query Language,数据查询语言
    关键字:select

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...