数据库以及优化技巧

目录

​编辑

1、海量数据下,如何根据计划调优sql?

2、mysql索引体系如何应对海量数据存储?

2.1 如何设计索引结构?需要考虑什么? 

3、聚簇索引和非聚簇索引全解析。

4、回表,索引覆盖,最左匹配

回表

索引覆盖

最左匹配

5、如何针对特定的sql场景,来进行索引的调优?


 

1、海量数据下,如何根据计划调优sql?

2、mysql索引体系如何应对海量数据存储?

数据持持久化存储到磁盘中,没有办法直接把全量的数据一次性读取到内存中,因此需要分块读取,每次读取一部分。

磁盘预读:磁盘跟内存在进行交互的时候有一个最基本的逻辑单位称之为页,也叫作datapage,页的大小一般与操作系统相关,一般是4k或者8k,我们在进行数据数据读取的时候,一般会读取页的整数倍。例如mysql中的innodb引擎默认一次性读取16k。所以需要上面描述的分块读取。

2.1 如何设计索引结构?需要考虑什么? 

如果我们设计一个索引结构应该考虑如下图所示问题,主要包括数据格式,数据结构和io性能

 用各种数据结构设计索引的缺点:

哈希表:

 二叉树:

 B树:

B+树: 

 

 B+树索引一般都有几层?

一般情况下,3-4层的B+树足以支撑千万级别的数据量存储。选择索引列的时候尽可能选择占用空间小的key值,key值占用空间越小,存储的数据量越大。

1.一个表可以创建多少个索引?

很多个

2.一个索引对应一颗B+树还是多个索引对应一颗?

一个索引对应一颗

3、聚簇索引和非聚簇索引全解析。

我们知道在B+树的叶子结点中存储实际的数据,那么当一张表中存在多个索引的时候,数据存储几份?

如果是1份的话,那么其他索引的叶子结点存储什么信息呢?

mysql的官方解释是primarykey,但是这个东西不能直接翻译为主键,因为在mysql的innodb存储引擎中,每一条记录的插入必须跟某一个索引存储在一起。如果表中有主键,那么数据就会和主键存储在一起,如果没有主键,那么会选择唯一间进行存储,如果没有唯一键,那么mysql会生成6字节的rowid进行存储。也就是说,mysql的数据存储只有一份,那么跟数据绑定存储的索引为聚簇索引,而没有跟数据绑定的存储称之为非聚簇索引

4、回表,索引覆盖,最左匹配

回表

检索了两次b+树,效率低,不推荐使用,很多情况下mysql用到了索引但是查询慢,很多就是因为回表问题。

索引覆盖

 如果查询语句变为 select id,name,age就会涉及回表。索引覆盖效率高,推荐使用。

最左匹配

 1,2,4用到了组合索引。其中4如果查询结果一样,mysql优化器会对其进行优化。

现在看下面这种情况:

表abc:

该表中的组合索引涉及到表中的所有字段,发生了索引覆盖现象,所以就不遵守最左匹配原则。

5、如何针对特定的sql场景,来进行索引的调优?

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值