华清远见-重庆中心-数据库阶段技术个人总结

华清远见-重庆中心-数据库阶段技术个人总结

1 、数据库的三范式是什么?
  • 第一范式(1NF):列不可再分
    • 每一列属性都是不可再分的属性值,确保每一列的原子性
    • 两列的属性相近或相似或一样,尽量合并属性一样的列,确保不产生冗余数据
  • 第二范式(2NF):属性完全依赖于主键
    • 第二范式(2NF)是在第一范式(1NF)的基础上建立起来的,即满足第二范式(2NF)必须先满足第一范式(1NF)。第二范式(2NF)要求数据库表中的每个实例或行必须可以被惟一地区分。为实现区分通常需要为表加上一个列,以存储各个实例的惟一标识。这个惟一属性列被称为主键
  • 第三范式(3NF):属性不依赖于其他非主属性,属性直接依赖于主键
    • 数据不能存在传递关系,即没个属性都跟主键有直接关系而不是间接关系。像:a–>b–>c 属性之间含有这样的关系,是不符合第三范式的。
2、一张自增表里面总共有 7 条数据,删除了最后 2 条数据,重启 MySQL 数据库,又插入了一条数据,此时 id 是几?

一般情况下,我们创建的表的类型是InnoDB,如果新增一条记录(不重启mysql的情况下),这条记录的id是8;但是如果重启(文中提到的)MySQL的话,这条记录的ID是6。因为InnoDB表只把自增主键的最大ID记录到内存中,所以重启数据库或者对表OPTIMIZE操作,都会使最大ID丢失。

3、如何获取当前数据库版本?
  • 方法一:

    • 进入mysql安装目录,输入[localhost@root]/usr/local/src/mysql/bin >mysql -V;或者[localhost@root]/usr/local/src/mysql/bin >mysql --version;
  • 方法二:

    • 进入mysql安装目录,输入? 或help命令,如

      [localhost@root]/usr/local/src/mysql/bin >mysql -I;
      或
      [localhost@root]/usr/local/src/mysql/bin >mysql --help;
      或
      [localhost@root]/usr/local/src/mysql/bin >mysql -?;
      
  • 方法三:进入mysql,输入select version()命令获取

    • [localhost@root]/usr/local/src/mysql/bin /mysql > select version();
  • 方法四:进入mysql,输入status命令获取

    • [localhost@root]/usr/local/src/mysql/bin /mysql > status;
  • 方法五: 进入mysql,输入\s命令获取

    • [localhost@root]/usr/local/src/mysql/bin /mysql > \s;
4、char 和 varchar 的区别是什么?
  • 固定长度 & 可变长度

    • VARCHAR类型用于存储可变长度字符串,是最常见的字符串数据类型。它比固定长度类型更节省空间,因为它仅使用必要的空间(根据实际字符串的长度改变存储空间)。有一种情况例外,如果MySQL表使用ROW_FORMAT=FIXED创建的话,每一行都会使用定长存储
    • CHAR类型用于存储固定长度字符串:MySQL总是根据定义的字符串长度分配足够的空间。当存储CHAR值时,MySQL会删除字符串中的末尾空格(在MySQL 4.1和更老版本中VARCHAR 也是这样实现的——也就是说这些版本中CHAR和VARCHAR在逻辑上是一样的,区别只是在存储格式上)。
      同时,CHAR值会根据需要采用空格进行剩余空间填充,以方便比较和检索。但正因为其长度固定,所以会占据多余的空间,也是一种空间换时间的策略;
  • 存储方式

    • VARCHAR需要使用1或2个额外字节记录字符串的长度:如果列的最大长度小于或等于255字节,则只使用1个字节表示,否则使用2个字节。假设采用latinl字符集,一个VARCHAR(10)的列需要11个字节的存储空间。VARCHAR(1000)的列则需要1002 个字节,因为需要2个字节存储长度信息。

      VARCHAR节省了存储空间,所以对性能也有帮助。但是,由于行是变长的,在UPDATE时可能使行变得比原来更长,这就导致需要做额外的工作。如果一个行占用的空间增长,并且在页内没有更多的空间可以存储,在这种情况下,不同的存储引擎的处理方式是不一样的。例如,MylSAM会将行拆成不同的片段存储,InnoDB则需要分裂页来使行可以放进页内。

5、MySQL 的内连接、左连接、右连接有什么区别?

​ 左连接返回包括左表中的所有记录和右表中连接字段相等的记录;

​ 右连接返回包括右表中的所有记录和左表中连接字段相等的记录;

​ 内连接只返回两个表中连接字段相等的行

6、MySQL 索引是怎么实现的?

​ mysql的索引是由存储引擎来实现,不同的存储引擎实现方式不同。

7、怎么验证 MySQL 的索引是否满足需求?

​ 使用 explain 查看 SQL 是如何执行查询语句的,从而分析你的索引是否满足需求。

​ explain 语法:EXPLAIN SELECT surname,first_name form a,b WHERE a.id=b.id 10.

8、说一下数据库的事务隔离?
  • 原子性(Atomicity)
    • 原子性是指事务包含的所有操作要么全部成功,要么全部失败回滚,这和前面两篇博客介绍事务的功能是一样的概念,因此事务的操作如果成功就必须要完全应用到数据库,如果操作失败则不能对数据库有任何影响。
  • 一致性(Consistency)
    • 一致性是指事务必须使数据库从一个一致性状态变换到另一个一致性状态,也就是说一个事务执行之前和执行之后都必须处于一致性状态。
  • 隔离性(Isolation)
    • 隔离性是当多个用户并发访问数据库时,比如操作同一张表时,数据库为每一个用户开启的事务,不能被其他事务的操作所干扰,多个并发事务之间要相互隔离。
  • 持久性(Durability)
    • 持久性是指一个事务一旦被提交了,那么对数据库中的数据的改变就是永久性的,即便是在数据库系统遇到故障的情况下也不会丢失提交事务的操作。
9、说一下 MySQL 常用的引擎?
  • MyISAM存储引擎:不支持事务、也不支持外键,优势是访问速度快,对事务完整性没有 要求或者以select,insert为主的应用基本上可以用这个引擎来创建表,支持3种不同的存储格式,分别是:静态表;动态表;压缩表
  • InnoDB存储引擎:该存储引擎提供了具有提交、回滚和崩溃恢复能力的事务安全。但是对比MyISAM引擎,写的处理效率会差一些,并且会占用更多的磁盘空间以保留数据和索引。
    InnoDB存储引擎的特点:支持自动增长列,支持外键约束
  • MEMORY存储引擎:Memory存储引擎使用存在于内存中的内容来创建表。每个memory表只实际对应一个磁盘文件,格式是.frm。memory类型的表访问非常的快,因为它的数据是放在内存中的,并且默认使用HASH索引,但是一旦服务关闭,表中的数据就会丢失掉。
    MEMORY存储引擎的表可以选择使用BTREE索引或者HASH索引,两种不同类型的索引有其不同的使用范围
  • MERGE存储引擎:Merge存储引擎是一组MyISAM表的组合,这些MyISAM表必须结构完全相同,merge表本身并没有数据,对merge类型的表可以进行查询,更新,删除操作,这些操作实际上是对内部的MyISAM表进行的。
10、 说一下 MySQL 的行锁和表锁?
  • mysql中表锁和行锁的区别是:1、表锁偏向于myisam存储引擎,行锁偏向innodb存储引擎;2、表锁开销小。行锁开销大;3、表锁的锁粒度大,行锁的锁粒度小。
11、说一下乐观锁和悲观锁?
  • 乐观锁:总是假设最好的情况,每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据,可以使用版本号机制和CAS算法实现。乐观锁适用于多读的应用类型,这样可以提高吞吐量,像数据库提供的类似于write_condition机制,其实都是提供的乐观锁。在Java中java.util.concurrent.atomic包下面的原子变量类就是使用了乐观锁的一种实现方式CAS实现的。
  • 悲观锁:顾名思义,就是比较悲观的锁,总是假设最坏的情况,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会阻塞直到它拿到锁(共享资源每次只给一个线程使用,其它线程阻塞,用完后再把资源转让给其它线程)。传统的关系型数据库里边就用到了很多这种锁机制,比如行锁,表锁等,读锁,写锁等,都是在做操作之前先上锁。Java中synchronized和ReentrantLock等独占锁就是悲观锁思想的实现。
12、MySQL 问题排查都有哪些手段?
  • 使用 show processlist 命令查看当前所有连接信息。
  • 使用 explain 命令查询 SQL 语句执行计划。
  • 开启慢查询日志,查看慢查询的 SQL。
13、 如何做 MySQL 的性能优化?
  • 选择最合适的字段属性
  • 尽量把字段设置为NOT NULL
  • 使用连接(JOIN)来代替子查询(Sub-Queries)
  • 使用联合(UNION)来代替手动创建的临时表
  • 事务
  • 使用外键
  • 锁定表
  • 使用索引
  • 优化查询语句
14、mysql 对一个大表做在线ddl,怎么进行实施的才能尽可能降低影响?
  • 建立一个和“test”一样表结构的新表,表名为test_new。create table test_new like test;

  • 将test表中数据拷贝到test_new中。insert into test_new select * from test;

  • 在test_new上执行ddl操作

  • 最后将执行过ddl更新的test_new表改名为test,原test表改名为test_old。Rename table test to test_old, test_new to test;

  • 确认检查无误后drop掉test_old表

15、 Redis 是什么?都有哪些使用场景?

​ Redis:REmote DIctionary Server(远程字典服务器)是完全开源免费的,用C语言编写的,遵守BSD协议,是一个高性能的(key/value)分布式内存数据库,基于内存运行并支持持久化的NoSQL数据库,是当前最热门的NoSql数据库之一,也被人们称为数据结构服务器。

  • redis使用场景
    • 热点数据的缓存
    • 限时业务的运用
    • 计数器相关问题
    • 排行榜相关问题
    • 分布式锁
    • 延时操作
    • 分页、模糊搜索
    • 点赞、好友等相互关系的存储
    • 队列
16、 Redis 有哪些功能?
  • 基于本机内存的缓存
  • 如果电脑重启,写入内存的数据是不是就失效了呢,这时Redis还提供了持久化的功能。
  • 哨兵(Sentinel)和复制
  • 集群(Cluster
17、Redis 支持的数据类型有哪些?
  • String(字符串)
  • hash(哈希)
  • list(列表)
  • set(集合)
  • zset(sorted set:有序集合)
18、 怎么保证缓存和数据库数据的一致性?
  • 选择淘汰缓存

    • 原因:数据可能为简单数据,也可能为较复杂的数据,复杂数据进行缓存的更新操作,成本较高,因此一般推荐淘汰缓存
  • 选择先淘汰缓存,再更新数据库

    • 原因:假如先更新数据库,再淘汰缓存,假如缓存淘汰失败,那么后面的请求都会得到脏数据,直至缓存过期。假如先淘汰缓存再更新数据库,如果数据库更新失败,只会产生一次缓存miss,相比较而言,后者对业务影响更小一点。
  • 延时双删策略

    • 同时有一个请求A进行更新操作,另一个请求B进行查询操作

      (1)请求A进行写操作,删除缓存
      (2)请求B查询发现缓存不存在
      (3)请求B去数据库查询得到旧值
      (4)请求B将旧值写入缓存
      (5)请求A将新值写入数据库

      次数便出现了数据不一致问题。采用延时双删策略得以解决

      public void write(String key,Object data){
          redisUtils.del(key);
          db.update(data);
          Thread.Sleep(100);
          redisUtils.del(key);
      }
      
19、 Redis 如何做内存优化?
  • 缩减键值对象
  • 共享对象池
  • 字符串优化
  • 编码优化
  • 控制key的数量
20、Redis 常见的性能问题有哪些?该如何解决?
  • Master 些内存快照, save 命令快照,save 命令调度 rdbSave 函数,会阻塞主线程的工作,当快照比较大时对性能影响是非常大的,会间断性暂停服务,所以 Master 最好不要写内存快照。

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

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

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

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值