数据库相关
数据库架构¶
如何设计一个关系型数据库
索引模块常见问题:
- 为什么要使用索引
为了快速查询数据
- 什么样的信息能成为索引
主键、唯一键以及普通键等
- 索引的数据结构
建立二叉树进行二分查找、建立B-Tree结构、建立B+-Tree结构、建立Hash结构
- 密集索引和稀疏索引的区别
密集索引文件中的每个搜索码值都对应一个索引值
稀疏索引文件只为索引码的某些值建立索引项
索引优化¶
二叉树¶
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);