锐单电子商城 , 一站式电子元器件采购平台!
  • 电话:400-990-0325

2021年Java知识体系总结,Java开发面试中常问的数据库方面问题

时间:2022-10-24 22:00:02 uyb型高压电容物位变送器

  1. ON <表名称> --触发器属于某一表:插入此表时, 更新或删除操作会激活触发器. 我们不能安排两个触发器在同一张表的同一事件上。

  2. FOR EACH ROW --触发器的执行间隔:FOR EACH ROW通知触发器 每隔一行执行一次动作,而不是整个表。

  3. <触发器SQL语句> --触发器包含要触发的触发器SQL句子:这里的句子可以是任何合法的句子, 包括复合语句,但是这里的语句受的限制和函数的一样。

存储过程是什么?


简单来说,就是一组SQL语句集,功能强大,可以实现一些复杂的逻辑功能,类似于JAVA语言方法;

ps:存储过程与触发器有点相似,都是一组SQL但是存储过程是主动调用的,而且功能比触发器更强大,触发器是触发后自动调用的;

有哪些特性

  1. 输入输出参数可以声明变量if/else, case,while通过编写存储过程,可以实现复杂的逻辑功能;

  2. 函数的普遍特性:模块化,封装,代码复用;

  3. 速度快,只有第一次执行需要编译和优化步骤,后续调用可以直接执行,节省上述步骤;

 DROP PROCEDURE IF EXISTS `proc_adder`;  DELIMITER ;;  CREATE DEFINER=`root`@`localhost` PROCEDURE `proc_adder`(IN a int, IN b int, OUT sum int)  BEGIN      #Routine body goes here...        DECLARE c int;      if a is null then set a = 0;       end if;          if b is null then set b = 0;      end if;        set sum  = a   b;  END  ;;  DELIMITER ;    set @b=5;  call proc_adder(0,@b,@s);  SELECT @s as sum;        create table tab2(     tab2_id varchar(11)  );    DROP TRIGGER if EXISTS t_ai_on_tab1;  create TRAILING t_ai_on_tab1  AFTER INSERT ON tab1  for EACH ROW  BEGIN     INSERT INTO tab2(tab2_id) values(new.tab1_id);  end;    INSERT INTO tab1(tab1_id) values('0001');    SELECT * FROM tab2;   

MySQL优化


  1. 打开查询缓存,优化查询

  2. explain你的select查询可以帮助您分析查询句或表结构的性能瓶颈。EXPLAIN 查询结果还会告诉你如何使用索引主键,如何搜索和排序你的数据表

  3. 只要使用一行数据limit 1,MySQL在找到数据后,数据库引擎将停止搜索,而不是继续检查下一个符合记录的数据

  4. 构建搜索字段的索引

  5. 使用 ENUM 而不是 VARCHAR,如果你有一个字段,如性别、国家、国家、状态或部门,你知道这些字段的值是有限和固定的,那么你应该使用它们 ENUM 而不是VARCHAR。

  6. Prepared StatementsPrepared Statements它与存储过程非常相似,在后台运行SQL我们可以使用语句集合 prepared statements 无论是性能问题还是安全问题,都有很多好处。Prepared Statements 您可以检查一些您绑定的变量,以保护您的程序免受SQL注入式攻击

  7. 垂直分表

  8. 选择正确的存储引擎

key和index的区别


  1. key 它是数据库的物理结构,包括两个意义和功能,一个是约束(关注约束和规范数据库的结构完整性),另一个是索引(辅助查询)。primary key, unique key, foreign key 等

  2. index它是数据库的物理结构,只是辅助查询,创建时会在另一个表空间(mysql中的innodb表空间)以类似目录的结构存储。索引分为前缀索引、全文索引等。

Mysql 中 MyISAM 和 InnoDB 有什么区别?


区别:

  1. InnoDB支持事务,MyISAM不支持,对InnoDB每一条SQL默认情况下,语言被包装成事务并自动提交,这将影响速度,因此最好使用多种语言SQL语言放在begin和commit组成事务;

  2. InnoDB支持外键,而MyISAM不支持。包含外键的一个InnoDB表转为MYISAM会失败;

  3. InnoDB是收集索引,数据文件与索引绑定,必须有主键,通过主键索引效率很高。但辅助索引需要两次查询,先查询主键,再通过主键查询数据。所以主键不要太大,因为主键太大,其他索引也会很大。而MyISAM是非聚集索引,数据文件是分离的,索引保存的是数据文件的指针。主键索引和辅助索引是独立的。

  4. InnoDB不保存表的具体行数,执行select count(*) from table需要全表扫描MyISAM用变量保存整个表的行数,执行上述句子时只需读出变量,速度非常快;

  5. Innodb不支持全文索引MyISAM支持全文索引,查询效率MyISAM要高;

如何选择:

  1. 是否支持事务,如果你想选择innodb,若无需考虑MyISAM;

  2. 如果表中的绝大多数只是阅读查询,可以考虑MyISAM,如果读写频繁,请使用InnoDB。

  3. 系统崩溃后,MyISAM更难恢复,能否接受;

  4. MySQL5.5版本开始Innodb已经成为Mysql默认引擎(以前是MyISAM),这表明它的优势是显而易见的。如果你不知道该用什么,那就用吧InnoDB,至少不差。

创建数据库表的注意事项


一、字段名及字段配制合理性

  1. 消除关系不密切的字段

  2. 字段命名应该有规则和相应的含义(不是英语的一部分,拼音的一部分,类似的a.b.c这样一个意义不明的字段)

  3. 尽量不要使用缩写字段命名(大部分缩写字段含义都不清楚)

  4. 不要混用字段(如果要有可读性,可以用下划线连接多个英语单词)

  5. 不要使用保留字或关键字

  6. 保持字段名和类型的一致性

  7. 仔细选择数字类型

  8. 为文本字段留出足够的余量

建议完成后处理系统特殊字段

  1. 添加删除标记(如操作员、删除时间)

  2. 建立版本机制

三、表结构合理配置

  1. 多字段的处理是表中是否有字段可以分解成更小、更独立的部分(例如,人可以分为男性和女性)

  2. 处理多值字段时,表可分为三个表,使检索和排序更加调节,并保证数据的完整性!

四、其它建议

  1. 独立存储大数据字段,以影响性能(如简介字段)

  2. 使用varchar类型代替char,因为varchar动态分配长度,char指定长度固定。

  3. 在查询和索引定义上,为表创建主键对没有主键的表有一定的影响。

  4. 避免表字段运行为null,建议设置默认值(例如:int类型设置默认值为0)在索引查询中,效率立显!

  5. 最好在唯一和非空字段上建立索引。建立过多的索引对以后的插入和更新有一定的影响(考虑到实际情况)。

redis


redis单线程问题


单线程是指网络请求模块使用一个线程(因此不需要考虑并发安全),即一个线程处理所有网络请求,其他模块仍使用多个线程。

为什么说redis能够快速执行


  1. 大多数请求都是纯内存操作(非常快)

  2. li>

    采用单线程,避免了不必要的上下文切换和竞争条件

  3. 非阻塞IO - IO多路复用

redis的内部实现


内部实现采用epoll,采用了epoll+自己实现的简单的事件框架。epoll中的读、写、关闭、连接都转化成了事件,然后利用epoll的多路复用特性,不在io上浪费一点时间 这3个条件不是相互独立的,特别是第一条,如果请求都是耗时的,采用单线程吞吐量及性能很差。redis为特殊的场景选择了合适的技术方案。

Redis关于线程安全问题


redis实际上是采用了线程封闭的观念,把任务封闭在一个线程,自然避免了线程安全问题,不过对于需要依赖多个redis操作的复合操作来说,依然需要,而且有可能是分布式锁。

使用redis有哪些好处?


  1. 速度快,因为数据存在内存中,类似于HashMap,HashMap的优势就是查找和操作的时间复杂度都是O(1)

  2. 支持丰富数据类型,支持string,list,set,sorted set,hash

  3. 支持事务,操作都是原子性,所谓的原子性就是对数据的更改要么全部执行,要么全部不执行

  4. 丰富的特性:可用于缓存,消息,按key设置过期时间,过期后将会自动删除

redis相比memcached有哪些优势?


  1. memcached所有的值均是简单的字符串,redis作为其替代者,支持更为丰富的数据类型

  2. redis的速度比memcached快很多

  3. redis可以持久化其数据

  4. Redis支持数据的备份,即master-slave模式的数据备份。

  5. 使用底层模型不同,它们之间底层实现方式 以及与客户端之间通信的应用协议不一样。Redis直接自己构建了VM 机制 ,因为一般的系统调用系统函数的话,会浪费一定的时间去移动和请求。

  6. value大小:redis最大可以达到1GB,而memcache只有1MB

Redis主从复制


过程原理:

  1. 当从库和主库建立MS关系后,会向主数据库发送SYNC命令

  2. 主库接收到SYNC命令后会开始在后台保存快照(RDB持久化过程),并将期间接收到的写命令缓存起来

  3. 当快照完成后,主Redis会将快照文件和所有缓存的写命令发送给从Redis

  4. 从Redis接收到后,会载入快照文件并且执行收到的缓存的命令

  5. 之后,主Redis每当接收到写命令时就会将命令发送从Redis,从而保证数据的一致

缺点:所有的slave节点数据的复制和同步都由master节点来处理,会照成master节点压力太大,使用主从从结构来解决

redis两种持久化方式的优缺点


  1. RDB 持久化可以在指定的时间间隔内生成数据集的时间点快照(point-in-time snapshot)

  2. AOF 持久化记录服务器执行的所有写操作命令,并在服务器启动时,通过重新执行这些命令来还原数据集。

  3. Redis 还可以同时使用 AOF 持久化和 RDB 持久化。当redis重启时,它会有限使用AOF文件来还原数据集,因为AOF文件保存的数据集通常比RDB文件所保存的数据集更加完整

RDB的优点:

  1. RDB 是一个非常紧凑(compact)的文件,它保存了 Redis 在某个时间点上的数据集。 这种文件非常适合用于进行备份: 比如说,你可以在最近的 24 小时内,每小时备份一次 RDB 文件,并且在每个月的每一天,也备份一个 RDB 文件。 这样的话,即使遇上问题,也可以随时将数据集还原到不同的版本。

  2. RDB 非常适用于灾难恢复(disaster recovery):它只有一个文件,并且内容都非常紧凑,可以(在加密后)将它传送到别的数据中心,或者亚马逊 S3 中。

  3. RDB 可以最大化 Redis 的性能:父进程在保存 RDB 文件时唯一要做的就是 fork 出一个子进程,然后这个子进程就会处理接下来的所有保存工作,父进程无须执行任何磁盘 I/O 操作。

  4. RDB 在恢复大数据集时的速度比 AOF 的恢复速度要快

Redis 常见的性能问题都有哪些?如何解决?


  1. Master写内存快照,save命令调度rdbSave函数,会阻塞主线程的工作,当快照比较大时对性能影响是非常大的,会间断性暂停服务,所以Master最好不要写内存快照。

  2. Master AOF持久化,如果不重写AOF文件,这个持久化方式对性能的影响是最小的,但是AOF文件会不断增大,AOF文件过大会影响Master重启的恢复速度。Master最好不要做任何持久化工作,包括内存快照和AOF日志文件,特别是不要启用内存快照做持久化,如果数据比较关键,某个Slave开启AOF备份数据,策略为每秒同步一次。

  3. Master调用BGREWRITEAOF重写AOF文件,AOF在重写的时候会占大量的CPU和内存资源,导致服务load过高,出现短暂服务暂停现象。

  4. Redis主从复制的性能问题,为了主从复制的速度和连接的稳定性,Slave和Master最好在同一个局域网内

redis 提供 6种数据淘汰策略


  1. volatile-lru:从已设置过期时间的数据集(server.db[i].expires)中挑选最近最少使用的数据淘汰

  2. volatile-ttl:从已设置过期时间的数据集(server.db[i].expires)中挑选将要过期的数据淘汰

  3. volatile-random:从已设置过期时间的数据集(server.db[i].expires)中任意选择数据淘汰

  4. allkeys-lru:从数据集(server.db[i].dict)中挑选最近最少使用的数据淘汰

  5. allkeys-random:从数据集(server.db[i].dict)中任意选择数据淘汰

  6. no-enviction(驱逐):禁止驱逐数据

我有一个微信公众号,经常会分享一些Java技术相关的干货;如果你喜欢我的分享,可以用微信搜索“Java团长”或者“javatuanzhang”关注。

Docker步步实践

目录文档:

①Docker简介

②基本概念

③安装Docker

④使用镜像:

⑤操作容器:

⑥访问仓库:

⑦数据管理:

⑧使用网络:

⑨高级网络配置:

⑩安全:

⑪底层实现:

⑫其他项目:

NZLa-1628214624253)]

④使用镜像:

[外链图片转存中…(img-MENcuj57-1628214624255)]

⑤操作容器:

[外链图片转存中…(img-OIlRBFac-1628214624257)]

⑥访问仓库:

[外链图片转存中…(img-CBTYyj2N-1628214624258)]

⑦数据管理:

[外链图片转存中…(img-iOYnutgi-1628214624259)]

⑧使用网络:

[外链图片转存中…(img-E8USk7qF-1628214624260)]

⑨高级网络配置:

[外链图片转存中…(img-Ja7aBPm8-1628214624261)]

⑩安全:

[外链图片转存中…(img-jyAGosyZ-1628214624261)]

⑪底层实现:

[外链图片转存中…(img-oDXhiDol-1628214624262)]

⑫其他项目:

[外链图片转存中…(img-gUkw3UYB-1628214624263)]

有需要完整版源码+笔记的朋友点击这里免费获取

锐单商城拥有海量元器件数据手册IC替代型号,打造电子元器件IC百科大全!

相关文章