1.redis和常用数据库有什么区别?

        redis是非关系型数据库,也是缓存数据库,就是把数据存储在缓存中,缓存读取速度快,能够大幅度提高运行效率,但是保存时间有限。关系型数据库,比如mysql,主要用于存放持久化数据,将数据存储在硬盘中,读取速度相对较慢,但是存放时间会比较久。

        redis主要存放一些常用的但是不经常变动的数据,比如用户信息,或者字典值之类的数据,一次减轻数据库的压力。

2.脏读,幻读、不可重复读的区别

  • 脏读:就是读到了另一个事务还没有提交的数据,也就是说事务A读到了事务B修改但没有提交的数据
  • 幻读:是想进行写入操作时第一次读到的数据被其他事务修改,导致自己无法插入数据的情况,注重于读写。也就是事务A读取了数据库后几条数据找到最后一条后准备在它下面再添加一条数据,却因为事务B加过了这条数据导致自己无法插入数据。
  • 不可重复读:指的是执行同一个查询语句查到两次结果不同,原因是由于其他事务在两次查询期间对数据进行了修改并提交操作,导致结果发生变更,注重于读读。

3.事务的隔离级别

  • 读未提交(Read Uncommitted):可以读到其他事务还没有提交的执行结果。
  • 读已提交(Read Committed):事务只能看见其它事务已经提交的结果数据。
  • 可重复度(repeatable Read):MySql的默认隔离级别,保证同一事务的不同操作在并发读取的行数据是一样的
  • 序列化(Serializable):隔离的最高级别,通过强制让事务有序执行,解决幻读等问题。事务执行期间,对每个数据行加了共享锁,可能会引起其它事务查询超时等现象

4.redis的五种数据类型

        String数据类型、List 数据类型、Hash数据类型(散列类型)、set数据类型(无序集合)、Sorted Set数据类型 (zset、有序集合)。

5.redis的回收策略

        #volatile-lru:从已设置过期时间的数据集选择最近使用最少的淘汰策略

        #volatile-ttl:从已设置过期时间的数据集中选择将要过期的进行淘汰

        #volatile-random:从已设置过期时间的数据集任意挑选数据淘汰

        #allkeys-lru:从全部数据集中选择最近使用最少的淘汰策略

        #allkeys-random:从全部数据集中任意挑选数据淘汰

        #noeviction:根本就不淘汰任何键值对,当内存已满时,如果做读操作,例如 get 命令,它将正常工作,而做写操作,它将返回错误。(默认)

6.sql优化

  • 对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引。
  • 应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描
  • 应尽量避免在 where 子句中使用!=或<>操作符,否则将引擎放弃使用索引而进行全表扫描
  • 应尽量避免在 where 子句中使用 or 来连接条件,否则将导致引擎放弃使用索引而进行全表扫描
  • in 和 not in 也要慎用,否则会导致全表扫描,很多时候用 exists 代替 in 是一个好的选择
  • 应尽量避免在where子句中对字段进行函数操作
  • 少用select*
  • like 后面的%也会导致查全表
  • 尽量让查询语句走索引,会让查询速度有大幅度提高

7.什么是索引?索引类型有几种,各有什么特点?

        索引是对数据库表中一列或多列的值进行排序的一种结构,使用索引可快速访问数据库表中的特定信息,用我自己的话来说就相当于字典前面的小表一样。索引一共五种类型:

  • 普通索引,基本的索引,没有任何限制,用于加速查询,数据可以重复
  • 组合索引,指多个字段上创建的索引,只有在查询条件中使用了创建索引时的第一个字段,索引才会被使用
  • 唯一索引,索引列的值必须唯一,但允许有空值。如果是组合索引,则列值的组合必须唯一。
  • 主键索引,特殊的唯一索引,一个表只能有一个主键,不允许有空值。一般是在建表的时候同时创建主键索引。也就是在唯一索引的基础上相应的列必须为主键
  • 全文索引,用来查找文本中的关键字

8.union all和union的区别

        Union:对两个结果集进行并集操作,不包括重复行,同时进行默认规则的排序;

        Union All:对两个结果集进行并集操作,包括重复行,不进行排序;

9.数据库三大范式

第一范式的目标是确保每列的原子性:如果每列都是不可再分的最小数据单元(也称为最小原子单元)
第二范式首先要满足第一范式,并且表中非主键列不存在在对主键的部分依赖。第二范式要求每个表只描述一件事。
第三范式是,满足第二范式,并且表中的列不存在对非主键列的传递依赖。