数据库面试知识总结

一、视图

1.安全性 

因为视图是虚拟的,物理上是不存在的,只是存储了数据的集合,视图中数据是根据基表的更新而更新,用户不可以更改/删除视图。

2.方便,简化数据操作

当我们业务需求要查出多张表的数据,这时我们可能会关联多张表查询处理.如果这个查询sql复杂的话也影响了查询效率. 

这个时候我们就可以创建视图,查询时候只需要 select * from view 就ok啦~

3.订制数据

在实际业务中,比如一个后台管理系统,里面分好几种角色:采购员、销售、技术员、后勤...

后勤部的人可能只需要一些和后勤有关的数据,与他无关的数据对于他们没有意义,这时候我们可以根据业务创建一个后勤视图view_logistics

二、索引

注意:索引在提高查找速度的同时,降低增删改的速度(用户写入的速度)

创建索引
  1. ALTER TABLE table_name ADD INDEX index_name (column_list)
  2. CREATE INDEX index_name ON table_name (column_list)
  • ALTER TABLE允许在单个语句中更改多个表,因此可以在同时创建多个索引。
  • 不能用CREATE INDEX语句创建PRIMARY KEY索引。
优缺点

优点:

1、类似书目索引,提高数据检索的效率,降低数据库的IO成本(不需要全表扫描)

2、通过索引列对数据进行排序,降低数据排序的成本,降低了CPU的消耗

缺点:

1、实际上索引也是一张表,该表保存了主键与索引字段,并指向实体表的记录,所以索引列也是要占用空间的

2、虽然索引大大提高了查询速度,同时却会降低更新表的速度,如对表进行INSERT、UPDATE和DELETE。

     因为更新表时,MySQL不仅要保存数据,还要保存一下索引文件

3、每次更新添加了索引列的字段,都会调整因为更新所带来的键值变化后的索引信息

4、索引只是提高效率的一个因素,如果你的MySQL有大数据量的表,就需要花时间研究建立最优秀的索引,或优化查询语句,

MySQL目前主要有以下几种索引类型:

    1.普通索引(非聚集索引

    2.唯一索引

    3.主键索引  (聚集索引

    4.组合索引

    5.全文索引

1、普通索引:key(字段名1,字段名2, .... ):它只具有索引的基本功能——提速(其他索引不但有提速还有额外功能)

2、唯一索引:unique key (字段名1,字段名2, .... ) duplicate

3、主键索引:primary key (字段名1,字段名2, .... ) unique key + not null

MySQL 的索引结构包含有:

   BTree索引

   Hash索引

   full-text全文索引

   R-Tree索引

需要创建索引的情况

1、主键自动建立唯一索引 Primary Key = Unique Key + Not Null

2、频繁作为查询条件的字段应该创建索引(银行系统的银行账号、电信系统的手机号)

3、查询中与其它表关联的字段,外键关系建立索引

4、查询中排序的字段,排序字段若通过索引去访问将大大提高排序速度

5、查询中统计或者分组字段

6、单值/组合索引的选择问题:在高并发下倾向创建组合索引    index(name,age,gender)

不需要创建索引的情况

1、表记录太少

2、经常增删改的表:提高了查询速度,同时却会降低更新表的速度,如对表进行INSERT、UPDATE和DELETE。因为更新表时,MySQL不仅要保存数据,还要保存一下索引文件

3、频繁更新的字段不适合创建索引,因为每次更新不单单是更新了记录还会更新索引,加重了IO负担

4、Where条件里用不到的字段不创建索引,如果根据银行卡号查找就要建立索引

5、数据重复且分布平均的表字段(某个数据列包含许多重复的内容)。

如果一个表中有2000条记录,表索引列有1980个不同的值,那么这个索引的选择性就是1980/2000=0.99。一个索引的选择性越接近于1,这个索引的效率就越高

避免索引失效

1、尽量全值匹配 

     index(name,age,gender) 组合索引, where name='zhansgan' and age=23 and gender='男',全值匹配,使用索引效率高。

    当建立了索引列后,能在where条件中使用索引的尽量使用

2、遵循最佳左前缀法则:如果组合索引,要遵守最左前缀法则。指的是查询从索引的最左前列开始并且不跳过索引中间列。 

      带头大哥不能死,中间兄弟不能断。

      index(name,age,gender) 组合索引,where后面是name才会使用索引,否则都是全表扫描,可以理解为有name这个火车头索引就不会失效,有了这个火车头火车就可以跑,没有火车头只有车厢就是全表扫描。

      where name='zhangsan' and age=23, where name='zhangsan' , name作为开头上面的索引是有效的

      where age=23, gender='男'  name不作为开头索引无效,全表扫描

       where name='zhansgan' and gender='男' ,中间兄弟不能断,只用了索引的一部分name

3、不在索引列上做任何操作(计算、函数、(自动or手动)类型转换),会导致索引失效而转向全表扫描

4、尽量使用覆盖索引(只访问索引的查询(索引列和查询列一致)),减少使用 select * ,使用select name,age,gender

5、mysql 在使用不等于(!= 或者<>)的时候无法使用索引会导致全表扫描

6、is null,is not null 也无法使用索引

  1. like 如果以通配符开头(’%abc…’),会导致mysql索引失效,而变成全表扫描的操作

但是abc%不会失效

8、少用or,用它来连接时会索引失效

逻辑删除的目的:

1、为了大数据分析,直接删除就没有数据了

 2、删除后索引维护成本高

二叉树
平衡二叉树

左右子树的高度相差不超过 1 的树为平衡二叉树。

红黑树

红黑树(Red Black Tree) 是一种自平衡二叉排序树。

红黑树是每个节点都带有颜色属性的二叉排序树,颜色为红色或黑色。除了二叉排序树的特点,红黑树还有以下特点:

1. 节点是红色或黑色。

2. 根是黑色。

3. 所有叶子都是黑色(叶子是NIL节点)。

4. 每个红色节点必须有两个黑色的子节点。(从每个叶子到根的所有路径上不能有两个连续的红色节点。)

5.从任一节点到其每个叶子的所有简单路径都包含相同数目的黑色节点。

特点:是一个二叉排序树,趋近于平衡树(但是不能简单说就是平衡二叉树),查询的速度非常的快,查询叶子节点最大次数和最小次数不能超过2倍

红黑树是一种特化的AVL树(平衡二叉树),都是在进行插入和删除操作时通过特定操作保持二叉查找树的平衡,从而获得较高的查找性能

平衡树
B树

单个节点可以存储多个键值和数据的平衡树

因为内存的易失性。一般情况下,我们都会选择将 user 表中的数据和索引存储在磁盘这种外围设备中。

但是和内存相比,从磁盘中读取数据的速度会慢上百倍千倍甚至万倍,所以,我们应当尽量减少从磁盘中读取数据的次数。

B+树

B+树是一个平衡的多叉树,从根节点到每个叶子节点的高度差值不超过1,而且同层级的节点间有指针相互链接。

①B+ 树非叶子节点上是不存储数据的,仅存储键值,而 B 树节点中不仅存储键值,也会存储数据。

②B+ 树索引的所有数据均存储在叶子节点,而且数据是按照顺序排列的。

三、存储过程

存储过程包含一系列sql语句的集合,完成一个复杂的功能,存储过程可以被反复使用,执行效率高。

存储过程功能上类似于Java里面封装的函数。

DELIMITER:定界符

在命令行客户端中,如果有一行命令以分号结束,如输入下面的语句:

mysql> select * from test_table;

回车后,mysql将会执行该命令。

但有时候,不希望MySQL这么做,可能输入较多的sql语句,且语句中包含有分号,那么我们就可以重新定义定界符。

CALL show_goods; -- 调用存储过程
-- 存储过程  类似于java中函数
delimiter $$ -- 将原来";"这个定界符替换为"$$"
CREATE PROCEDURE show_goods()
BEGIN
   UPDATE goods SET goods_number=goods_number+1;
   SELECT * FROM goods;
END $$

四、触发器(Trigger):

是一个特殊的存储过程,它的执行不是由程序调用,也不是手工启动,而是由事件触发

触发器经常用于加强数据的完整性约束和业务规则等。

在MySQL中,触发器可以在你执行INSERT、UPDATE或DELETE的时候,执行一些特定的操作。在创建触发器时,可以指定是在执行SQL语句之前或是之后执行这些操作。通过触发器,你可以实现一些业务逻辑或一些数据限制,在简化应用程序逻辑,优化系统性能时非常有用。

DELIMITER $$
CREATE TRIGGER student_insert_trigger
AFTER INSERT ON student FOR EACH ROW
BEGIN
    UPDATE student_total SET total=total+1;
END $$
DELIMITER ;

五、事务

Spring的事务传播特性(属性)

当事务方法被另一个事务方法调用时,必须指定事务应该如何传播。例如:一个方法运行在了一个开启了事务的方法中时,当前方法是使用原来的事务还是开启一个新的事务。

事务的传播行为可以由传播属性指定。Spring定义了7种类传播行为:

Propagation

PROPAGATION_REQUIRED:需要,  如果存在一个事务,则支持当前事务, 如果没有事务则开启(原来有就使用原来事物,没有就创建事物,一般Service的中更新类的操作)

PROPAGATION_SUPPORTS:支持, 如果存在一个事务,支持当前事务。如果没有事务,则非事务的执行(原来有就使用原来事物,没有就算了,一般Service的中查询操作

PROPAGATION_REQUIRES_NEW:总是开启一个新的事务。如果一个事务已经存在,则将这个存在的事务挂起。

PROPAGATION_MANDATORY: 必要的 如果已经存在一个事务,支持当前事务。如果没有一个活动的事务,则抛出异常。

PROPAGATION_NOT_SUPPORTED:总是非事务地执行,并挂起任何存在的事务。

PROPAGATION_NEVER:绝不 总是非事务地执行,如果存在一个活动事务,则抛出异常

PROPAGATION_NESTED:嵌套的 如果有就嵌套、没有就开启事务

六、数据库三范式

第一范式(1NF):原子性

第二范式(2NF):唯一性 (消除非主键依赖联合主键中的部分字段)

第三范式(3NF):独立性,消除传递依赖(非主键值不依赖于另一个非主键值,都应该依赖于主键)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值