Java面试题-数据库

数据库相关

  1. MySQL的索引使用

    默认会有主键索引。

    索引分类:单值索引、复合索引、唯一索引

    详细文章

  2. MySQL explain 分析

    MySQL通过explain关键字分析SQL的执行计划。(Oracle通过EXPLAIN PLAN FOR sql

    ID SELECT_TYPE TABLE PARTITIONS TYPE POSSIBLE_KEYS KEY KEY_LEN REF ROWS FILTERED EXTRA
    • ID:执行顺序由上至下,ID值越大越先执行。
    • SELECT_TYPE:查询的类型。
    • TABLE:输出结果集的表。
    • PARTITIONS:分区表命中的分区情况,非分区表为空。
    • TYPE:重要指标之一,访问类型。性能由好->差的连接类型为:system -> const -> eq_ref -> ref -> ref_or_null -> index_merge -> index_subquery -> range -> index -> all
    • POSSIBLE_KEYS:可能使用到的索引。
    • KEY:实际使用到的索引。
    • KEY_LEN:KEY的长度,越短越好。
    • REF:表连接的匹配条件。const:常数等值查询;func:表达式或函数或内部隐式转换。
    • ROWS:扫描行的数量。(估算)
    • FILTERED:条件过滤后,对比总数的百分比。
    • EXTRA:执行情况的说明和描述。

    详细文章

  3. 说说反模式设计

    数据库范式能够使数据库表的设计更加规范,但会导致业务模型涉及的表过多,一次查询需要多次关联,导致性能变差。出于对性能的保护,提出了反模式设计。核心思想是:空间换时间,数据冗余避免表关联过多产生的问题。

  4. 说说分库与分表设计

    一般表数据大于500万行或单表容量超过2GB。

    分库分表策略(分片策略):1、日期 2、Hash 3、范围 4、税率

    数据库中间件:MyCat 、 ShadingJDBC

    分库分表后查询逻辑:

    • 携带分片字段:对具体表进行分页查询。
    • 不携带分片字段:对每张表进行分页查询,然后通过中间件进行整合二次分页后返回给客户端。
  5. 分库与分表带来的分布式困境与应对之策

    产生的问题含有:跨库JOIN问题、排序分页问题、分布式ID问题

    跨库JOIN应对之策:

    1)建立全局表,存放所有模块可能依赖的字段,但只能存不怎么修改的字段。

    2)字段冗余设计,也就是反模式设计

    排序分页应对之策:

    1)增大PageSize

    2)禁止跳页查询,只允许下一页

    分布式ID应对之策:

    1)UUID

    2)数据库自增

    3)号段模式

    4)类似雪花算法

  6. 说说SQL优化之道

    1)定位慢SQL

    2)分析执行计划

    3)增加索引或修改SQL

    详细文章

  7. MySQL遇到的死锁问题

    1、本人经历过的数据库连接数导致生产死锁的问题

    正常逻辑为:A请求B数据->请求C数据->释放连接。

    数据库连接数为8,恰逢8个请求占有了连接数,连接未释放;此时新进的请求需要连接,相互等待资源释放,却又因为B->C连接数满无法等到,导致死锁。

  8. 存储引擎MyISAM和InnoDB

    MyISAM不支持事务

    由于多数系统都需要数据库的事务支持,MyISAM不支持事务,因此现有大部分都是InnoDB存储引擎。

    详细文章

  9. 数据库索引的原理

    Mysql以B+树为数据结构,通过树结构存储索引的数据,并在叶子结点存储索引的值。

  10. 为什么要使用B树

    查询效率高。

  11. 聚集索引与非聚集索引的区别

    聚集索引:一个表只能有一个。占用空间较非聚集索引小。

  12. limit 20000 加载很慢,如何处理

    MySQL的性能低是因为数据库要去扫描N + M条记录,然后又要放弃之前N 条记录,开销很大。

    1、缓存进行优化

    2、延迟关联:先通过limit查找索引字段,再通过原表和索引字段关联获得需要的数据

  13. 选择合适的分布式主键方案

    根据每个方案进行分析:

    1)UUID

    简单,长度过长,没有具体业务含义,不利于索引

    2)数据库自增

    2.1 单节点:创建一个表,每次插入一条数据,根据返回的自增主键为分布式主键。单节点有宕机风险

    2.2 集群:不同集群的自增设置起始值和步长。后期扩容时,需要考虑冲突。

    3)号段模式

    一批号段的主键ID,用完再次申请。

    4)类似雪花算法

    64位的ID,各大厂商有自己的一些开源框架,自行查看。

猜你喜欢

转载自blog.csdn.net/qq_36986510/article/details/129004512