Java 面试总结 --- 数据库相关

1、MySQL有索引了查询一定快吗?   

  • Atomic 原子性: 一个事务的所有系列操作步骤被看成是一个动作,所有的步骤要么全部完成要么一个也不会完成,如果事务过程中任何一点失败,将要被改变的数据库记录就不会被真正被改变。
  • Consistency 一致性: 在事务开始或结束时,数据库应该在一致状态。也就是说,通过各种途径包括外键约束等任何写入数据库的数据都是有效的,不能发生表与表之间存在外键约束,但是有数据却违背这种约束性。所有改变数据库数据的动作事务必须完成,没有事务会创建一个无效数据状态.
  • Isolated 隔离性: 主要用于实现并发控制, 隔离能够确保并发执行的事务能够顺序一个接一个执行,通过隔离,一个未完成事务不会影响另外一个未完成事务。
  • Durable 持久性: 一旦一个事务被提交,它应该持久保存,不会因为和其他操作冲突而取消这个事务。很多人认为这意味着事务是持久在磁盘上,但是规范没有特别定义这点。

这里的一致性是为了保证系统数据的保护性不变性,不论在何种并发的情况下。以转账案例为例,假设有五个账户,每个账户余额是100元,那么五个账户总额是500元,如果在这个5个账户之间同时发生多个转账,无论并发多少个,比如在A与B账户之间转账5元,在C与D账户之间转账10元,在B与E之间转账15元,五个账户总额也应该还是500元,这就是保护性不变性,这是一种「一致的状态」。

2、有没有做过分库分表?分库分表需要注意什么?   

这应该是全网最全的分库分表方案了_JavaMonsterr的博客-CSDN博客

3、MySQL索引类型有哪些?

  • B-树索引,使表中的每一行都会在索引上有一个对应值;
  • 哈希索引,可根据索引列对应的哈希值的方法获取表的记录行;
  • 普通索引,允许在定义索引的列中插入重复值和空值;
  • 唯一索引,可以避免数据出现重复;
  • 主键索引,是为主键字段创建的索引;
  • 空间索引,是对空间数据类型的字段建立的索引;
  • 全文索引,用来查找文本中的关键字;
  • 单列索引,即索引只包含原表的一个列。

4、MySQL有索引了查询一定快吗?   

不一定,可能会出现索引失效的情况

5、有哪些情况索引会失效?索引有什么好处?有什么坏处?

  1. 最佳左前缀法则:索引文件具有 B-Tree 的最左前缀匹配特性,如果左边的值未确定,那么无法使用此索引。

  2. 主键插入顺序

  3. 计算、函数、类型转换(自动或手动)导致索引失效

  4. 范围条件右边的列索引失效

  5. 不等于(!= 或者<>)导致索引失效

  6. is null可以使用索引,is not null无法使用索引

  7. like以通配符%开头索引失效

  8. OR 前后只要存在非索引的列,都会导致索引失效 

  9. 数据库和表的字符集统一使用utf8mb4

6、BTree存储索引,BTree是什么?根节点如何拓展的?   

BTree索引是最常用的mysql数据库索引算法,因为它不仅可以被用在=、>、<、>=、<=、between这些比较操作符上,还可以用于like操作符。
只要它的查询条件是一个不以通配符开头的常量则该索引生效;否则索引失效。

7、Hash索引和BTree索引区别

Hash仅适用于对等比较(=、>、<、>=、<=、between),而BTree可以支持like模糊查询。

不同的引擎支持不同的索引:Innodb和MyISAM默认的索引是BTree索引;而Mermory默认的索引是Hash索引。

BTree
BTree索引是最常用的mysql数据库索引算法,因为它不仅可以被用在=、>、<、>=、<=、between这些比较操作符上,还可以用于like操作符。
只要它的查询条件是一个不以通配符开头的常量则该索引生效;否则索引失效。

Hash
Hah索引只能用于对等比较,例如=、>、<、>=、<=、between。由于是一次定位数据,不像BTree索引需要从根节点到枝节点,最后才能访问到叶节点这样多次IO访问,所以检索效率远高于BTree索引。

为什么使用BTree比Hash多呢?

  1. Hash索引仅仅能满足=、>、<、>=、<=、between查询,不能使用范围查询。
  2. 联合索引中,Hash索引不能利用部分索引键查询。对于联合索引中的多个列,Hash要么全部使用,要么全部不适用,并不支持BTree支持的联合索引的最有前缀,也就是联合索引的前面一个或几个索引键进行查询时,Hash索引无法被利用。
  3. Hash索引无法避免数据的排序操作。由于Hash索引中存放的是经过Hash计算之后的Hash值,而且Hash值的大小关系并不一定和Hash运算前的键值完全一样,所以数据库无法利用索引的数据来避免任何排序运算。
  4. Hash索引任何时候都不能避免表扫描。Hash索引是将索引键通过Hash运算之后,将Hash运算结果的Hash值和所对应的行指针信息存放于一个Hash表中,由于不同索引键存在相同Hash值,所以即使满足某个Hash键值的数据的记录条数,也无法从Hash索引中直接完成查询,还是要通过访问表中的实际数据进行比较,并得到相应的结果。
  5. Hash索引遇到大量Hash值相等的情况后性能并不一定会比BTree高。对于选择性比较低的索引键,如果创建Hash索引,那么将会存在大量记录指针信息存于同一Hash值相关联。这样要定位某一条记录时就会非常麻烦,会浪费多次表数据访问,从而造成整体性能低下。
  6. Hash索引查找数据基本上能一次定位数据,当然有大量碰撞的话性能也会下降。而BTree索引就得在节点上挨个查找了,很明显在数据精确查找方面Hash索引的效率要高于BTree索引的;
  7. 因为Hash算法是基于等值计算的,所以对于like等范围查找Hash索引不支持;
  8. 对于BTree支持的联合索引的最有前缀,hash也是无法支持的,联合索引中的字段要么全用要么全不用。
  9. hash不支持索引排序,索引值和计算出来的hash值大小并不一定一致。

8、日常工作中有没有做过查询慢进行优化的操作?

  • 优化查询语句:使用更优化的查询语句,例如:使用JOIN代替子查询,避免使用  DISTINCT ,OR 等不必要的查询语句。
  • 避免使用SELECT *:尽量避免使用SELECT *语句,因为这会查询所有列,包括不必要的列,而且会消耗更多的系统资源。
  • 索引优化:确保表中的字段都有适当的索引,特别是在WHERE、ORDER BY、GROUP BY子句中使用的字段。多表联查时,join on  上的字段添加索引。但要避免过多的索引,因为过多的索引会降低写操作的性能
  • 分页查询:将查询结果分页返回,每次只查询部分结果,可以减少查询的数据量,从而提高查询速度。
  • 优化数据库结构:合理地设计数据库结构,避免使用过多的冗余字段和表,可以提高查询效率。
  • 数据库服务器优化:增加数据库服务器内存、优化配置、升级硬件等方式可以提高数据库服务器的处理能力,从而缩短查询时间。
  • 避免锁表:如果查询语句需要锁表,可能会导致查询时间过长,因此应该避免锁表,或者在非高峰时段进行查询。
  • 优化数据存储方式:对于大量数据,可以采用分区、分库、分表等方式进行存储,以提高查询效率。分库,采用微服务的模式进行分库,一个服务或者模块来建库,所有数据表在一个库中肯定会降低数据库性能。
  • 优化应用程序:优化应用程序中的查询语句、使用连接池等方式也可以提高查询性能
  • 缓存查询结果:对于查询结果比较固定的查询语句,可以将查询结果缓存起来,以提高查询效率。
  • 定期维护:定期清理无用数据、更新统计信息、重新组织表等维护操作可以提高查询性能

猜你喜欢

转载自blog.csdn.net/ddwangbin520/article/details/131232017
今日推荐