2022年6月19日记:Linux服务器开发,Mark老师,MySql索引原理及优化

推荐一个 零声学院 免费公开课程,个人觉得老师讲得不错,分享给大家:[Linux,Nginx,ZeroMQ,MySQL,Redis,fastdfs,MongoDB,ZK,流媒体,CDN,P2P,K8S,Docker,TCP/IP,协程,DPDK等技术内容,立即学习]
后台服务器:https://course.0voice.com/v1/course/intro?courseId=5&agentId=0


1.概述

  • 索引是物理概念,约束是逻辑概念。
  • 主键索引和唯一索引的差别在于主键索引不能为空,唯一索引可以有一个NULL值。
  • 构件表时PRIMARY KEY为显示创建主键,如果没创建会在UNIQUE NOT NULL中选择第一个作为主键。如果没有非空唯一索引,MySql则自动生成6字节_rowid作为主键。
  • 外键约束属于一种约束,用来保证两张表的完整性,是事务性的,在项目中尽量不要使用。
    2022年6月19日记:Linux服务器开发,Mark老师,MySql索引原理及优化_第1张图片

2.B+树

二叉树的全称是平衡二叉搜索树,B+树是多路平衡搜索树,搜索树的一个特征是按照中序遍历是一个有序的结构。平衡的是树的高度,目的是保证提供一个稳定的搜索时间复杂度,就是经过增删改查后依然稳定的时间复杂度。如果变成链表就会变成O(n)的时间复杂度,就不是一个平衡的。B+树是一个非常平衡的,主要体现在叶子节点都在同一层,每条链路的高度是一样的。
树的高度代表的是比较次数,红黑树是瘦高形状,用在内存中;而B+树是矮胖形状,用在访问磁盘中。一次磁盘IO是10ms左右,一次内存访问时100us左右,百万级的差异。
B+树是怎么映射磁盘的?一个节点是16K的数据,访问磁盘数据时拉去数据的大小通常是4K或是8K,正好是整数倍,配置文件中也是可以修改的。B+树的一个节点至少要存放两行数据。如果超过了16K,超过的部分会映射到共享表空间。非叶子节点存储的是索引信息,叶子节点存储的是数据信息。
2022年6月19日记:Linux服务器开发,Mark老师,MySql索引原理及优化_第2张图片
B+树的范围查询LIMIT1,5,相邻的叶子节点互相引用,避免了回溯查询。
自增如果数据较大可以采用bigint类型,如果每秒插入1亿条数据,需要5849年才能用完!
myisam中frm结尾是表信息文件;myd是数据文件,采用堆表组织存储;myi是索引文件,采用B+树组织存储。
inodb中frm是表信息结构;bbd是数据文件,采用B+树主键创建的聚集索引。利用辅助索引查找时,会找主键id,再通过主键id去找行数据,这就叫做回表查询。
inodb由段、区、页组成,段分为数据段,索引段,回滚段等;区大小为1MB(1个区由64个连续页组成);页的默认值为16K;页为逻辑页,磁盘物理大小一般为4K或者8K;为了保证区中的页的连续,存储引擎一般一次从磁盘中申请4-5个区。

2022年6月19日记:Linux服务器开发,Mark老师,MySql索引原理及优化_第3张图片

  • Buffer pool
  • Change buffer:缓存非唯一索引DML增删改操作,先缓存。如果是唯一索引先写日志,再异步线程进行刷盘,而非唯一索引会写到缓存后再进行刷盘。
  • Log buffer
  • LRU算法将很少使用的数据换出,这是缓存的热数据策略。环形缓冲区没有数据的移动。

最左匹配原则

对于组合索引,从左往右依次匹配,遇到<>between like就停止匹配。

覆盖索引

通过辅助索引就能够找到数据,而不需要通过聚集索引。辅助索引数据包含的少,所以树高度一般低于聚集索引,所以会有较少的磁盘io。查询聚集索引和辅助索引是不会回表查询的。

索引失效

  • select … where A and B 若A和B中有一个不包含索引,则索引失效
  • 索引字段参与运算,则索引失效。from_unixtime(idx)=‘2021-04-30’;
  • 索引字段发生隐式转换,则索引失效。‘1’隐式转换为1;
  • LIKE 模糊查询,通配符%开头,则索引失效。select *from user where name like ‘%ark’;
  • 在索引字段上使用NOT <> != 索引失效。id<>0,则修改为idx>0或idx<0;
  • 组合索引中,没使用第一列索引,则索引失效。

你可能感兴趣的:(c++,mysql,服务器,linux)