第一范式:所有列不可拆分
第二范式:基于第一范式上,非主键列完全依赖于主键
第三范式:基于第二范式上,非主键列只依赖与主键
三范式为了没有冗余的数据,降低了运行效率
反三范式:为了提高运行效率,提高读取性能,从而打破三范式
整数类型:tinyInt 、smallint、mediumint、int(integer)
小数类型:float、double、decimal(m,d)
日期类型:year、time、date、datetime
文本二进制类型:char、varchar
主键约束
非空约束
唯一约束
外键约束
检测约束
事务是一个不可分割的数据库操作系列,是数据库并发控制的基本单位,使数据库从一种一致性状态变到另一种一致性状态。
保证数据的一致性和完整性
原子性:事务要么全部执行,要么全部不执行
一致性:多个事务对同一个数据读取的结果是一样的
隔离性:事务之间不会干扰对方
持久性:一个事务提交后,是对数据库永久改变
操作事务的语句:BEGIN、 COMMIT ,ROLLBACK
读未提交
读已提交
可重复读
可串行化
是一种特殊文件,记录数据表中的引用指针
是一种数据结构,协助快速查询
优缺点
优点:加快检测速度,提高系统性能
缺点:时间上:创建索引和维护索引需要耗费时间,增删改需要动态维护,
会降低执行效率
空间上:索引占物理空间
索引的种类
主键索引:数据列不允许重复,不允许为空,只能有一个主键索引
唯一索引:不允许重复
普通索引
全文索引
磁盘i/o效率方面上:B+的非叶子节点不存储数据,所以每一层能存储更多的索引
间接的减少磁盘i/o的次数
范围查询效率方面上:B+树的叶子节点存储的是数据,用的是双向链表来关联
只需要查询两个节点进行遍历就行了
全表扫描方面上:只需要扫描叶子节点就可以了,不需要扫描整一棵树
B树每个节点都存储 k 和 data
B+只存在叶子节点 节点不存数据,索引可以存储更多的 k 操作效率更高
hash 不支持范围查询
索引跟数据放在一起
索引跟数据分开放
查询的字段没有全部命中索引,需要回表查询
最左边的优先,where子句中需要把使用最频繁的一列放在左边
索引参与了表达式计算
索引函数运算 between不会走索引
模糊查询不会走索引
正则表达式不走索引,检测这个串是否含有某个子串
返回所需要的列,不要使用 select *
只返回必要的行,使用 limit 来限制返回的数据
缓存重复查询的数据
myisam 使用的是表
innodb 行和表
两个或者多个事务在同一个资源上互相争夺,然后互相请求对方的资源,产生循环
解决:获取资源顺序一致
一次锁定所有资源
提供锁的粒度 行锁 变成 表锁
使用乐观锁
乐观锁:假设不会发生并发冲突,在修改数据的时候把事务锁起来,用在读比较多的地方
悲观锁:假设会发生冲突,在查询完数据的时候把事务锁起来,直到提交给事务,用在写比较多的地方
内连接有 等值连接 = (on a.id = b.id)
不等值连接 > (on a.id>b.id)
自连接 inner join (select * from 表a inner join 表b on a.id=b.id)
外连接有 左外连接 left outer join 左表为主,先查询出左表的数据,
通过on 来连接右表,没有匹配到的用null
右外连接
联合查询 union 和union all
union all不会合并重复的列
union 效率更高一些
子查询返回单行单列
查询最高的b
select * from a where b= (select max(b) from a)
子查询返回多行单列
子查询返回多行多列
group by
where发生分组前 约束声明对数据库
having发生在分组后,过滤声明对查询后的数据
create table
alter table 表名 add index 索引名字(列名)
create index 索引名 on 表名 (列名)
drop 删除整张表,包括表结构 ddl
delete 删除一行数据 dml 可以回滚
truncate 删除整张表数据 ddl
insert into 表名(name)values(xxx);
delete from 表名 where xx = xx
update 表名 set 列名=xx where xxx = xxx
冷备份:冷备份指在数据库关闭后,进行备份,适用于所有模式的数据库.
热备份:指与目标设备共同运转,当目标设备发生故障或停机时,热备设备立即承担起故障设备的工作任务,一般用于保证服务正常不间断运行
温备份:定期备份数据
不要使用 select *
在where上的列建立索引避免在where子句上使用 != <> 会是索引失效
避免查询字段进行null判断
避免在where 中使用 or 来连接数据 使用 union union all
避免使用模糊查询
in 和 not in 也会走模糊查询,使用exists 和 not exists
限定数据查询范围
读写分离
分表
分区