数据库知识


关系型数据库:

  • 架构
  • 索引
  • 语法
  • 理论范式

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

索引模块

常见问题

  • 为什么要使用索引

快速查询数据,避免全表扫描

  • 什么样的信息能成为索引

主键、唯一键以及普通键

  • 索引的数据结构

➢生成索引,建立二叉查找树进行二分查找 log(n)

➢生成索引,建立B-Tree结构进行查找

➢生成索引,建立B+-Tree结构进行查找

➢生成索引,建立Hash结构进行查找

  • 密集索引和稀疏索引的区别

B-Tree

定义

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


B+树

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

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


结论

B+ Tree更适合用来做存储索引

  • B+树的磁盘读写代价更低
  • B+树的查询效率更加稳定
  • B+树更有利于对数据库的扫描

Hash索引|也可以考虑一下

缺点

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

BitMap索引

不适合高并发的联机事务处理系统,适合并发较少且统计运算较多的系统

密集索弓|和稀疏索弓|的区别

  • 密集索引文件中的每个搜索码值都对应一个索引值
  • 稀疏索引文件只为索引|码的某些值建立索引项

额外的知识

InnoDB

  • 若一个主键被定义,该主键则作为密集索引
  • 若没有主键被定义,该表的第一个唯一 非空索引|则作为密集索引
  • 若不满足以上条件,innodb内部会生成一个隐藏主键(密集索引)
  • 非主键索弓引|存储相关键位和其对应的主键值,包含两次查找

衍生出来的问题,以mysq|为例

1、如何定位并优化慢查询Sq|

具体场景具体分析,只提出大致思路

  • 根据慢日志定位慢查询sq|
    # 查询全局变量
    show variables like '%quer%';
    

修改全局变量

set global slow_query_log = on;
set global long_query_time = 1;

![](https://i0.wp.com/tva1.sinaimg.cn/large/00831rSTly1gdft0wdnx3j31ef0u0n2n.jpg)

#本次会话mysql的条数
show status like ‘%slow_queries%’;

![](https://i0.wp.com/tva1.sinaimg.cn/large/00831rSTly1gdft163ewlj31mk0e8tap.jpg)


* 使用explain等工具分析sq|


* 修改sq|或者尽量让sq|走索引提升性能




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


#### 3、索引是建立得越多越好吗





### 存储引擎

##### 1、查看MySQL提供的所有存储引擎

```mysql
mysql> show engines;

从图中可以看出InnoDBMySQL当前默认的存储引擎(5.5版本后)。只有InnoDB是事务性存储引擎,支持事务,同时,它有行级锁和外键。

2、查看表的存储引擎
mysql> show table status like "zyctd";

解释一下什么是池化设计思想。什么是数据库连接池?为什么需要数据库连接池?

池化设计会初始预设资源,解决的问题就是抵消每次获取资源的消耗,如创建线程的开销,获取远程连接的开销等。除了初始化资源,池化设计还包括池子的初始值、池子的活跃值、池子的最大值等,这些特征可以直接映射到java线程池和数据库连接池的成员属性中。

数据库连接本质就是一个 socket 的连接。数据库服务端还要维护一些缓存和用户权限信息之类的 所以占用了一些内存。我们可以把数据库连接池是看做是维护的数据库连接的缓存,以便将来需要对数据库的请求时可以重用这些连接。为每个用户打开和维护数据库连接,尤其是对动态数据库驱动的网站应用程序的请求,既昂贵又浪费资源。*在连接池中,创建连接后,将其放置在池中,并再次使用它,因此不必建立新的连接。如果使用了所有连接,则会建立一个新连接并将其添加到池中。 *连接池还减少了用户必须等待建立与数据库的连接的时间。


评论
评论
  目录