面试题一数据库

面试题一数据库

  1. 事务四大特性(ACID)

    • 原子性:不可分割的操作单元,事务中所以操作,要么全部成功,要么测回到执行事务之前的状态
    • 一致性:如果在执行事务之前数据库是一致的,那么执行事务之后数据库也还是一致的。如:转账业务,无论事务执行成功与否,参与转账的两个账号余额之和应该是不变的。
    • 隔离性:事务操作之间彼此独立和透明互不影响,不同事务之间应该隔离开来
    • 持久性:一旦事务提交成功,事务中所有的数据操作都必须被持久化到数据库中,即使提交事务后,数据库马上崩溃,在数据库重启时,也必须能保证通过某种机制恢复数据。
  2. 数据库隔离级别

    • 脏读:未提交读Read uncommited 不添加共享锁

      分为两种情况:

      1. 事务B可以在事务A对记录的读取过程中修改同一记录,可能会导致事务A读取的数据是一个被破坏的或者是不完整的数据。
      2. 在事务A中可以读取到事务B中修改过的数据,但是事务B尚未提交,可能会发送的问题就是脏读
    • 不可重复读:已提交读Read commited

      在事务A中读取数据时对记录添加共享锁,待读取结束后才会立即释放该锁。那么事务B对该数据的修改要一直等待,直到A中的读取过程结束,但不是整个事务A的结束。所以,可能发生的问题就是事务A在不同阶段对同一记录的读取结果可能是不同的。

    • 幻读:可重复读Repeatable read

      系统管理员A将数据库中所有学生的成绩从具体分数改为ABCDE等级,但是系统管理员B就在这个时候插入了一条具体分数的记录,当系统管理员A改结束后发现还有一条记录没有改过来,就好像发生了幻觉一样,这就叫幻读。InnoDB 默认的事务隔离级别就是可重复读**。**可能发生的问题:当执行一个范围查询时,可能会发生幻读(解决幻读的方法:增加范围锁RangeS,锁定检索范围为只读,这样就避免了幻读)。

  3. 数据库三范式

    • 第一范式(1NF):列不可拆分

      只数据库表的每一列都是不可分割的基本数据项,同一列中不可能有多个值,即实体中的某个属性不能有多个值或者不能有重复的属性。

    • 第二范式(2NF):不能部分依赖

      满足第二范式必须先满足第一范式。实体的属性完全依赖于主键。所谓完全依赖是指不存在仅依赖主键一部分的属性。如果存在,那么这个属性和主关键字的这一部分应该分离出来形成一个新的实体,新实体与原实体之间是一对多的关系。

    • 第三范式(3NF):外键约束

      满足第三范式必须先满足第二范式。要求表中不能有其他表中存在的、存储相同信息的字段,通常实现是在通过外键去建立关联,因此第三范式只要记住外键约束就好了。

  4. 说一说你能想到的sql的优化?

    避免select *,将需要查找的字段列出来

    使用连接(join)来代替子查询

    用exists代替in

    使用limit对查询记录进行限定

    尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描

    尽量避免在 where 子句中使用!=或<>操作符,否则将引擎放弃使用索引而进行全表扫描。尽量避免在 where 子句中使用 or 来连接条件,否则将导致引擎放弃使用索引而进行全表扫描

  5. 什么是数据库索引?

    数据库索引,是数据库管理系统中一个排序的数据结构,以协助快速查询、更新数据库表中数据。索引通常使用B_Tree。B_Tree索引加速了数据访问,因为存储引擎不会再去扫描整张表得到数据;相反,它从根节点开始,根节点保存了子节点的指针,存储引擎会根据指针快速寻找数据。

  6. MySQL数据库的四类索引

    index --普通索引,数据可以重复,没有任何限制

    unique --唯一索引,要求索引列的值必须唯一,但允许有空值

    primary key --主键索引,是一种特殊的唯一索引,一个表只能有一个主键,不允许空值,一般是在创建表的同时创建主键索引

    组合索引 --多个字段上创建的索引,只有在查询条件中使用了创建索引时的第一个字段,索引才会被使用。

    fulltext – 全文索引,是对于大表的文本域:char,varchar,text列才能创建全文索引,主要用于查找文本中的关键字,并不是直接与索引中的值进行比较。fulltext更像是一个搜索引擎,配合match against操作使用,而不是一般的where语句加like。

    :全文索引目前只有MyISAM存储引擎支持全文索引,InnoDB引擎5.6以下版本还不支持全文索引

    所有存储引擎对每个表至少支持16个索引,总索引长度至少为256字节,索引有两种存储类型,包括B型树索引和哈希索引。

  7. 为什么使用B+树做索引而不使用哈希表做索引?

    • 哈希表是把索引字段映射成对应的哈希码然后再存放在对应的位置,这样的话,如果我们要进行模糊查找的话,显然哈希表这种结构是不支持的,只能遍历这个表。而B+树则可以通过最左前缀原则快速找到对应的数据。
    • 如果我们要进行范围查找,例如查找ID为100 ~ 400的人,哈希表同样不支持,只能遍历全表。
    • 索引字段通过哈希映射成哈希码,如果很多字段都刚好映射到相同值的哈希码的话,那么形成的索引结构将会是一条很长的链表,这样的话,查找的时间就会大大增加。
  8. 聚簇索引和非聚簇索引,在查询数据的时候有什么区别?

    聚簇索引查询比较快

    因为主键索引树的叶子节点直接就是我们要查询的整行数据了。而非主键索引的叶子节点是主键的值,查到主键的值以后,还需要再通过主键的值再进行一次查询

  9. 索引的优缺点,什么时候使用索引,什么时候不能使用索引?

    优点:提高查询效率

    缺点:更新数据时效率低,因为要同时更新索引

    对数据库进行频繁查询时要建立索引,如果要频繁更改数据时不建议使用索引

  10. 存储引擎MyISAM和InnoDB的区别?

    1)InnoDB支持事务,MyISAM不支持。

    2)MyISAM适合查询以及插入为主的应用,InnoDB适合频繁修改以及涉及到安全性较高的应用。

    3)InnoDB支持外键,MyISAM不支持。

    4)从MySQL5.5.5以后,InnoDB是默认引擎。

    5)MyISAM支持全文类型索引,而InnoDB不支持全文索引。

    6)InnoDB中不保存表的总行数,select count() from table时,InnoDB需要扫描整个表计算有多少行,但MyISAM只需简单读出保存好的总行数即可。注:当count()语句包含where条件时MyISAM也需扫描整个表。

    现在一般都选用InnoDB,主要是MyISAM的全表锁,读写串行问题,并发效率锁表,效率低,MyISAM对于读写密集型应用一般是不会去选用的。

    应用场景:

    • MyISAM不支持事务处理等高级功能,但它提供高速存储和检索,以及全文搜索能力。如果应用中需要执行大量的SELECT查询,那么MyISAM是更好的选择。
    • InnoDB用于需要事务处理的应用程序,包括ACID事务支持。如果应用中需要执行大量的INSERT或UPDATE操作,则应该使用InnoDB,这样可以提高多用户并发操作的性能。
  11. char和varchar的区别?

    • CHAR列长度固定为创建表时声明的长度,长度值范围是1到255
    • 当CHAR值被存储时,它们被用空格填充到特定长度,检索CHAR值时需删除尾随空格。
  12. delete、drop、truncate区别?

    • truncate 和 delete只删除数据,不删除表结构 ,drop删除表结构,并且释放所占的空间。
    • **删除数据的速度,**drop> truncate > delete
    • delete属于DML语言,需要事务管理,commit之后才能生效。drop和truncate属于DDL语言,操作立刻生效,不可回滚。
    • 使用场合:
      • 当你不再需要该表时, 用 drop;
      • 当你仍要保留该表,但要删除所有记录时, 用 truncate;
      • 当你要删除部分记录时(always with a where clause), 用 delete.
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章