数据库三大范式

  • 第1范式:每一列都是不可拆分的最小单元。
  • 第2范式:一张表只描述一件事情。
  • 第3范式:用外键做表的关联。

存储过程:

定义:

存储过程是一个预编译的SQL语句,优点是允许模块化的设计,就是说**只需创建一次,以后在该程序中就可以调用多次。**如果某次操作需要执行多次SQL,使用存储过程比单纯SQL语句执行要快。 调用:
1)可以用一个命令对象来调用存储过程。
2)可以供外部程序调用,比如:java程序。

优点:

1)因为预编译,所以嘛,效率肯定高
2)因为它的代码存于数据库中,所以呀,可以减少网络通讯。
3)安全性高,因为执行需要一定的权限
4)可重复使用,所以可以减少工作人员的操作量

缺点:

可移植性差,因为与数据库绑定

什么是事务:

就是把一堆事情(SQL语句)绑在一起做,都成功了才算完成,否则就恢复之前的样子 。

事务的四大特性:

  • 原子性
    要么都做,要么不做。
  • 持久性:
    做了之后就永远是做了,改变永远都存于数据库中了。
  • 隔离性:
    做的时候,其他人看不见,被隔离起来了。直到做完其他人才能看得见。
  • 一致性:
    事务前后,数据总额一致。

数据库隔离级别,每个级别会引发什么问题,mysql默认是哪个级别

四种级别以及每个级别会引发什么问题:
  • 未提交读:
    事务中的修改,即使没有提交,其他事务也可以看得到。产生脏读(小明正在修改数据库,小红读了小明修改的结果,但是小明修改出现了问题,数据回滚了,这个时候,小红读取的数据就是有问题的。)

  • 提交读:
    其他事务在该事务执行的过程中不能看见该事务的结果。只有当该事务执行完毕后,其他事务才能看见。会产生不可重复读。(剩最后三张票了,小明在智能售票台上点击了购买三张,这个时候小红比小明慢了一点(小明的事务还没有完成),她只购买一张。但是这个时候小明的事务完成了,小红那里的显示器突然变成了零张。你说小红生气不生气)

  • 可重复读:
    可重复读保证了每一行数据的一致性。解决了不可重复读的问题。但是却还有幻读的情况出现。(小明刚读在读1.8号上映的电影有哪些的时候,管理员又插入了几个1.8上映的新电影)

  • 可串行化:
    SERIALIZABLE是最高的隔离级别,它通过强制事务串行执行(注意是串行),避免了前面的的各种情况。

mysql默认的级别是\"可重复读\"。

索引的优缺点,什么时候使用索引,什么时候不能使用索引:

优点:提高查询速度。就像书有目录和没有目录的区别一样。
缺点:更改数据慢,因为也需要更改索引。

因此,当频繁查询时使用索引,当频繁更改时,不要使用索引。

MYSQL的两种存储引擎区别(事务、锁级别等等),各自的适用场景

结构共同点:

  • 都是B+树。
    结构不同点:
  • INnoDB:使用聚集索引(叶子节点就是数据)
  • MyISAM:非聚集索引(叶子节点指向数据的地址)

MYISAM 不支持事务,不支持外键,表锁,插入数据时,锁定整个表,查表总行数时,不需要全表扫描 (查询多时使用,没有事务要求)
INNODB 支持事务,支持外键,行锁,查表总行数时,全表扫描(修改多时使用,安全性要求搞事使用)

数据库优化:

原则

  • sql尽量使用索引

  • 对sql语句优化 :
    where代替having
    尽量不要使用or,in,not in,! = 等进行查询,否则会放弃索引。另外索引不是越多越好,索引对查询效率提高的同时会降低插入和更新的效率,还有就是尽量限制查询条件来避免全表扫描,数据库字段类型越小越好,默认值不能使用NULL,数据库数据量过大时应分库分表。

在一条查询语句上有很多个字段时,是每个字段都建立索引,还是建立复合索引。

看具体情况,一般来说组合索引比单个索引的效率高,因为索引不能过多。

怎么建立复合索引,怎么查看索引。

从经常需要查询的字段开始包含几列建立,MySQL是用explain。

收藏 打印