Skip to content

数据库相关

数据库架构

如何设计一个关系型数据库

image-20230510111911449

索引模块常见问题:

  1. 为什么要使用索引

为了快速查询数据

  1. 什么样的信息能成为索引

主键、唯一键以及普通键等

  1. 索引的数据结构

建立二叉树进行二分查找、建立B-Tree结构、建立B+-Tree结构、建立Hash结构

  1. 密集索引和稀疏索引的区别

密集索引文件中的每个搜索码值都对应一个索引值

稀疏索引文件只为索引码的某些值建立索引项

索引优化

二叉树

B-Tree

  • 根节点至少包括两个孩子
  • 树中每个节点最多含有m个孩子(m>=2)
  • 除根节点和叶节点外,其他每个节点至少有ceil(m/2)个孩子
  • 所有叶子节点都位于同一层

B+-Tree

B+树是B树的变体,其定义基本与B树相同,除了:

  • 非叶子节点的子树指针与关键字个数相同
  • 非叶子节点的子树指针P[,指向关键字值[K[,K[i+1])的子树
  • 非叶子节点仅用来索引,数据都保存在叶子节点中
  • 所有叶子节点均有一个链指针指向下一个叶子结点

B+Tree更适合用来做存储索引 - B+树的磁盘读写代价更低 - B+树的查询效率更加稳定 - B+树更有利于对数据库的扫描

Hash索引

hash索引比tree更快,只需要一次计算查找即可大致定位

缺点 - 仅仅能满足“=”,“IN”,不能使用范围查询 - 无法被用来避免数据的排序操作 - 不能利用部分索引键查询 - 不能避免表扫描 - 遇到大量Hash值相等的情况后性能并不一定就会比B-Tree高

衍生出来的问题,以mysql为例

如何定位并优化慢查询Sql

  • 根据慢日志定位慢查询sql
-- 查询相关变量
show variables like '%quer%';

-- 查询相关日志
show status like '%slow_queries%';

-- 打开慢日志
set global slow_query_log=on;

-- 设置慢查询时间为1秒
set global long_query_time=1;
  • 使用explain等工具分析sql
-- 使用explain关键字进行查询的分析
explain select name from person_info_large order by name desc;

-- type优化与extra优化
  -- type: index > all这两项如何出现就需要优化了
  -- extra中出现以下两项意味着mysql无法使用索引,效率会受到重大影响:
  -- Using filesort;Using temporary
  • 修改sql或者尽量让sql走索引
-- 修改前:
select name from person_info_large order by name desc;

-- 修改后:
select account from person_info_large order by account desc;

-- tian'wan
alter table person_info_large add index idx_name(name);

联合索引的最左匹配原则的成因

索引是建立得越多越好吗