zjdznl
8/3/2018 - 2:57 PM

database basic

数据库的基本问题

第一范式

没一个字段都是不可再分的基本数据项

第二范式

非主键属性完全依赖主键. 不符合的会出现下面的问题: 比如(学号 姓名 课程 学分)

  • 数据冗余. 同样的数据每一行都要记录. 同样的课程学分一样.
  • 更新冗余. 调整课程学分,所有行都要更新
  • 插入异常 无法插入新的课程,因为没有对应的主键学号
  • 删除异常

第三范式

属性不依赖其他的非主属性,在 2nf基础上消除传递依赖

BC范式

消除主属性对健的传递依赖

索引用 B+ 树可以减少树的深度,从而减少io次数1

n 阶树

  • 根结点至少有两个孩子节点
  • 其他节点的孩子数量下限是 ceil n/2 上限是n

索引的作用

  1. 加快查找的速度
  2. 使用 group by |order by 时减少排序和分组的时间
  3. 实现表之间的参照完整性
  4. 保证该列数据记录的唯一性
  5. 在查询的过程中,使用优化隐藏器,提高系统的性能

缺点

  1. 索引也是需要占用物理空间的
  2. 当对带有索引的表中的数据进行 增删改 的时候,索引的信息需要动态维护

什么时候使用索引

  1. 在作为主键的列上建立索引
  2. 在经常用在连接的列上,比如外键
  3. 范围搜索
  4. 排序
  5. 用作 where 子句的条件

不用索引

  • 查询很少
  • 数据时 text bit image 类型的数据
  • 性能因素,建立索引比不建索引还慢: 性别字段

复合索引

select * from users where area=’beijing’ and age=22;

每个单独建立索引 : 只会使用一个索引

建立复合索引: (area, age, salary) 应用最佳作前缀特性,相当于建立了三个索引 1,2,3 | 1,2 | 1

因此建立复合索引时,将最常用作限制条件的放在左边

索引不包含含有 null 的列

使用短索引

对长字段,前面的字符唯一,只需要索引前缀即可.

优点:减少空间,减少IO,提高查询速度

排序的索引问题

mysql 查询只会用一个索引,那么:

where order 都有索引 只会用where

  • 尽量不要包含多个列的排序,需要建立复合索引

like

'%...'不会使用索引.

不鼓励使用 like

不要在列上进行运算

YEAR(adddate)<2007 改成 adddate<‘2007-01-01’; 前者会进行全列扫描

NOT IN 改成 NOT EXITS

id != 3 改成 <3 or >3

备份方式 重点

  1. 自带 mysqldump

备份时锁表,只读不写.

备份时间很久

  1. 拷贝数据目录.只是用 myisam 引擎表,和机器平台无关
  2. 双机热备

一般大公司都是采用这种方式,搭建多台数据库服务器,进行主从复制

mysql 添加索引

  • 普通索引
  • 主键索引
  • 唯一索引
  • 全文索引
  • 复合索引(多列索引)