数据库结构

数据库索引

索引的数据结构

  • 二叉树
  • 红黑树
  • Hash表
  • B-Tree

二叉树(mysql中并不使用该数据结构)

每个节点不仅存储数据,还会存储该数据所在的磁盘地址。
优点:若数据在二叉树中存储结构平衡时,性能会大幅提高。
缺点:若数据在二叉树中是单边增长,那么查询性能并不会有所提升

红黑树(是一种平衡二叉树,mysql同样不使用该数据结构)

当二叉树不平衡时,会自动平衡二叉树。
优点:能提高查询效率
缺点:当数据量增多时,树的深度会越来越深,当大量数据以红黑树结构存储时,需要查询的结果在叶子结点,那么查询效率也是十分低效的。

B树(多叉平衡树)

与二叉树结构相比,每个父节点不再只有2个子节点,可以有多个子节点。
特点
叶结点具有相同深度,叶结点指针为null
所有的索引不会重复
索引中的数据由左到右依次递增
每个节点最多存储16kb数据

B+树

结构与B树相似。
区别
B+树在叶子结点增加一个指针
B+树在非叶子结点只存储索引,不存放数据,在都只能存储16kb的情况下,只存储索引可以存储更多信息。叶子结点存储数据
B+树叶子结点使用指针连接,对范围查找有很好的支持

Hash表

每个插入的索引都会进行一次Hash运算,存储到Hash运算表中,再次使用索引查询时,直接进行一次哈希运算,得到在哈希表中的存储的位置,得到数据的地址。
Hash定位效率比B+树更高,因为只需要进行一次哈希运算。但是Hash索引不能进行范围查找!

存储引擎(形容表而非数据库)

数据库中的数据都会存储在本地磁盘中。
MyISAM(非聚集索引):先从MYI中查找索引,然后根据MYI中存储的数据的地址去MYD中定位数据
表名.frm 数据库表的定义文件
表名.MYD 存储表的所有数据
表名.MYI 存储表的所有索引文件(索引字段)
InnoDB(聚集索引,InnoDB的主键索引就是聚集索引)
表名.frm 表结构文件
表名.ibd 存储索引和数据,索引和数据合并都放在叶子结点
InnoDB表中一定会有主键,若建表时没申明主键时,会自动创建一个唯一的主键在后台维护。推荐主键使用整型自增主键。
整型自增主键对比UUID

  1. UUID要先转换成ACSII然后一位一位的比较大小,效率比整型慢
  2. UUID长度比整型长,占用空间更大
  3. 自增整型主键的原因是所有的B+树节点存储的元素都是递增的,每一个叶子结点也都是从左到右递增。可以通过每个叶子结点的指针快速找到下一个叶子结点的元素。如果进行范围查找时就可以利用指针进行快速查找。使用UUID时,插入的数据生成的UUID是随机的,当节点满时在查数据会分裂数据再进行树平衡,会消耗大量资源!

数据库优化

为什么数据库查询会慢?

查询数据流程大体为:客户端发送请求——>服务器——>服务器解析请求——>程序执行查询SQL,返回结果——>反馈给客户端。
在这里我们可以明显的看出来,这里执行查询操作最耗时的部分就是去执行SQL查询结果。
之所以数据库查询慢,说明我们查询了大量无效数据或者数据量过大。想要去提高查询的效率,那么我们就需要对SQL数据库执行查询模块进行优化设计。

如何优化数据库访问

1.只查询需要的记录
2.尽量避免多变联查
3.查询不要返回全部的列(不需要的列不返回)
4.不要重复查询相同的数据

索引种类

主键索引:唯一且不能为空
唯一索引:唯一
普通索引:没有限制
全文索引:在开发中一般使用ES搜索引擎

优点

让查询效率提高

缺点

修改表数据的时候,索引文件也要发生改变

联合索引使用规则

先创建一张表,Id设为主键

create table user(
	id int(10) NOT NULL AUTO_INCREMENT primary key,
	name VARCHAR(20),
	age int(10)
);

创建联合索引

ALTER TABLE user ADD INDEX other_index(name, age);

使用索引的情况及规则如下:

//使用主键索引
select * from user where id = ?
//使用二级索引
select * from user where name = ? and ...
select * from user where name = ? and age = ?;
select * from user where name like 'xxx%';
select * from user where name = ? and age like 'x%';
//不能使用二级索引
select * from user where age = ?;
select * from user where age = ? and name = ?;
select * from user where name like '%xxx';
select * from user where name like '%xxx%';
//第一个字段可以使用二级索引,第二个字段不能使用二级索引
select * from user where name = ? and age like '%x';

简单来说,创建联合索引时,字段必须顺序查询,且模糊查询必须后置%时,才能够使用二级索引。注意当一张表中的所有字段都是索引时,非聚簇索引查询结束后不会再去聚簇索引中查询,直接返回数据。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值