热点
安全护航万物互联:构建坚固应用生态防护网,reasoning_content:我们要求以网站管理员的口吻,写一个与技术、科技相关的标题,主题是安全护航万物互联:构建坚固的应用生态防护网需要简短精炼,30字以内直接输出标题,不要加说明nn可能的比如构建坚固应用生态,安全护航万物互联 或者 网站管理员:安全护航万物互联,构建应用生态防护网 但要注意口吻既然是网站管理员,可以更直接一点:安全护航万物互联,筑牢应用生态防护网 或者 作为网站管理员,我这样构建应用生态安全防护网 但字数可能超nn更简洁:安全护航万物互联,构建应用生态防护 但需要完整nn考虑到30字以内,可以:安全护航万物互联:构建应用生态防护网 正好13字?数一下:安全护航万物互联:构建应用生态防护网 共14个字(包括冒号)或者加上坚固的:安全护航万物互联:构建坚固应用生态防护网 17字nn作为网站管理员口吻,可以用第一人称或直接陈述比如:我为万物互联构建坚固应用生态防护网 但不够像标题nn最好用网站管理员:安全护航万物互联,构建坚固应用生态防护网 但字数可能超:网站管理员:安全护航万物互联,构建坚固应用生态防护网 共24字(包括冒号)可以nn或者更直接:安全护航万物互联,构建坚固应用生态防护网 16字nn注意要求是以’网站管理员’的口吻,但标题中不一定需要出现网站管理员字样,只要语气像即可但为了明确,可以加网站管理员说:之类的,但可能多余nn最稳妥:直接输出一个精炼标题例如:安全护航万物互联:构建坚固应用生态防护网 这个符合要求吗?注意原主题中构建坚固的应用生态防护网有的,去掉的更简洁最终确定:安全护航万物互联:构建坚固应用生态防护网 共17字
筑牢移动应用安全防线,护航万物互联,reasoning_content:我们要求以网络运维工程师的口吻,写一个与技术、科技相关的标题,主题是安全护航万物互联:构建移动应用坚固防线需要简短精炼,30字以内直接输出标题,不要加说明nn网络运维工程师的口吻可以体现专业、务实、强调安全防护可能的标题如:筑牢移动应用安全防线,护航万物互联 但字数可能超?我们需要计数nn筑牢移动应用安全防线,护航万物互联 共16字?实际字符:筑、移、动、应、用、安、全、防、线,护、航、万、物、互、联,共16个汉字没问题但需要更符合网络运维工程师的口吻,可能用加固、守护等另一个选项:移动应用安全加固:为万物互联保驾护航 字数:移动应用安全加固:为万物互联保驾护航 共16字?移动(2)应用(2)安全(2)加固(2):(1)为(1)万物(2)互联(2)保驾(2)护航(2) 总共?算汉字:移、动、应、用、安、全、加、固、为、万、物、互、联、保、驾、护、航 17个字?加上冒号?冒号不算汉字,但算标点通常标题中冒号允许但要求30字以内17字可以但感觉不够简洁nn更好的:筑牢移动安全防线,护航万物互联 去掉应用?但主题明确是移动应用保留应用筑牢移动应用安全防线,护航万物互联 16字,可以nn另一个思路:用运维视角:运维视角:移动应用安全护航万物互联 字数:运维视角:移动应用安全护航万物互联 共?运、维、视、角、(冒号)、移、动、应、用、安、全、护、航、万、物、互、联 16汉字+冒号,可以nn但要求以网络运维工程师的口吻,可能直接写网络运维:移动应用安全坚固防线 字数少更精炼:安全加固移动应用,护航万物互联 11字nn综合,我选择:筑牢移动应用安全防线,护航万物互联 因为筑牢有工程感,防线符合网络运维的防护意识注意字数:16字,符合
万物互联新纪元:移动端安全技术开启无限可能,reasoning_content:我们要求以网络安全工程师的口吻,写一个与技术、科技相关的标题,主题是万物互联新篇章:移动端开启无限可能新纪元需要简短精炼,30字以内直接输出标题,不要说明nn作为网络安全工程师,可能会从安全角度切入,比如“安全护航万物互联”之类的但主题强调新篇章、移动端、新纪元可以结合安全与无限可能例如:“万物互联新纪元,移动端安全开启无限可能”?但字数要控制nn可能的“移动端安全解锁万物互联新纪元” 或者 “万物互联新篇:移动端安全赋能无限可能”但注意要简洁nn考虑到网络安全工程师的口吻,可能更强调安全作为基石比如:“网安守护,移动端开启万物互联新纪元” 或 “万物互联新纪元,移动端安全先行”但题目要求“直接输出一个标题”,且要与“技术、科技”相关nn建议“万物互联新纪元:移动端安全开启无限可能” 字数:16字符合nn或者更精简:“移动端安全,万物互联新纪元” 10字nn但为了体现“新篇章”和“无限可能”,可以写:“移动端赋能,万物互联新篇章” 不过少了安全角度nn既然要求以网络安全工程师口吻,最好包含安全元素例如:“移动端安全护航,万物互联新纪元” 12字nn另一个:“万物互联新篇:移动端安全技术开启无限可能” 18字nn最终决定:直接输出一个标题我选择:“万物互联新纪元:移动端安全技术开启无限可能” 字数18字
15 9 月 2026, 周二

副标题#e#

MySQL一直了解得都不多,之前写sql准备提交生产环境之前的时候,老员工帮我检查了下sql,让修改了一下存储引擎,当时我使用的是Myisam,后面改成InnoDB了。为什么要改成这样,之前都没有听过存储引擎,于是网上查了一下。

事实上使用不同的存储引擎也是有很大区别的,下面猿友们可以了解一下。

一、存储引擎的比较

B+树 | MySQL索引使用原则

注:上面提到的B树索引并没有指出是B-Tree和B+Tree索引,但是B-树和B+树的定义是有区别的。

在 MySQL 中,主要有四种类型的索引,分别为: B-Tree 索引, Hash 索引, Fulltext 索引和 R-Tree 索引。

B-Tree 索引是 MySQL 数据库中使用最为频繁的索引类型,除了 Archive 存储引擎之外的其他所有的存储引擎都支持 B-Tree 索引。Archive 引擎直到 MySQL 5.1 才支持索引,而且只支持索引单个 AUTO_INCREMENT 列。

不仅仅在 MySQL 中是如此,实际上在其他的很多数据库管理系统中B-Tree 索引也同样是作为最主要的索引类型,这主要是因为 B-Tree 索引的存储结构在数据库的数据检索中有非常优异的表现。

一般来说, MySQL 中的 B-Tree 索引的物理文件大多都是以 Balance Tree 的结构来存储的,也就是所有实际需要的数据都存放于 Tree 的 Leaf Node(叶子节点) ,而且到任何一个 Leaf Node 的最短路径的长度都是完全相同的,所以我们大家都称之为 B-Tree 索引。当然,可能各种数据库(或 MySQL 的各种存储引擎)在存放自己的 B-Tree 索引的时候会对存储结构稍作改造。如 Innodb 存储引擎的 B-Tree 索引实际使用的存储结构实际上是 B+Tree,也就是在 B-Tree 数据结构的基础上做了很小的改造,在每一个Leaf Node 上面出了存放索引键的相关信息之外,还存储了指向与该 Leaf Node 相邻的后一个 LeafNode 的指针信息(增加了顺序访问指针),这主要是为了加快检索多个相邻 Leaf Node 的效率考虑。

InnoDB是Mysql的默认存储引擎(Mysql5.5.5之前是MyISAM)

可能对于没有了解过索引的猿友这样看这篇文章十分吃力,这类猿友有必要先对Mysql索引有个大体的了解,可以看看另外一篇文章: 数据库查询优化——Mysql索引http://blog.csdn.net/u013142781/article/details/51424174看完这篇文章我们再回头看看上面的文字说明吧。

接下来我们先看看B-树、B+树的概念。弄清楚,为什么加了索引查询速度会加快?

二、B-树、B+树概念

B树

即二叉搜索树:

1、所有非叶子结点至多拥有两个儿子(Left和Right);

2、所有结点存储一个关键字;

3、非叶子结点的左指针指向小于其关键字的子树,右指针指向大于其关键字的子树;

如:

B+树 | MySQL索引使用原则

B-树

是一种多路搜索树(并不是二叉的):

1、定义任意非叶子结点最多只有M个儿子;且M>2;

2、根结点的儿子数为[2, M];

3、除根结点以外的非叶子结点的儿子数为[M/2, M];

4、每个结点存放至少M/2-1(取上整)和至多M-1个关键字;(至少2个关键字)

5、非叶子结点的关键字个数=指向儿子的指针个数-1;

6、非叶子结点的关键字:K[1], K[2], …, K[M-1];且K[i] < K[i+1];

7、非叶子结点的指针:P[1], P[2], …, P[M];其中P[1]指向关键字小于K[1]的子树,P[M]指向关键字大于K[M-1]的子树,其它P[i]指向关键字属于(K[i-1], K[i])的子树;

8、所有叶子结点位于同一层;

如:(M=3)

B+树 | MySQL索引使用原则

B-树的搜索,从根结点开始,对结点内的关键字(有序)序列进行二分查找,如果命中则结束,否则进入查询关键字所属范围的儿子结点;重复,直到所对应的儿子指针为空,或已经是叶子结点;

B-树的特性:

1、关键字集合分布在整颗树中;

2、任何一个关键字出现且只出现在一个结点中;

3、搜索有可能在非叶子结点结束;

4、其搜索性能等价于在关键字全集内做一次二分查找;

5、自动层次控制;

由于限制了除根结点以外的非叶子结点,至少含有M/2个儿子,确保了结点的至少利用率。

所以B-树的性能总是等价于二分查找(与M值无关),也就没有B树平衡的问题;

由于M/2的限制,在插入结点时,如果结点已满,需要将结点分裂为两个各占M/2的结点;删除结点时,需将两个不足M/2的兄弟结点合并;

B+树

B+树是B-树的变体,也是一种多路搜索树:

1、其定义基本与B-树同,除了:

2、非叶子结点的子树指针与关键字个数相同;

3、非叶子结点的子树指针P[i],指向关键字值属于[K[i], K[i+1])的子树(B-树是开区间);

5、为所有叶子结点增加一个链指针;

6、所有关键字都在叶子结点出现;

如:(M=3)

B+树 | MySQL索引使用原则

B+的搜索与B-树也基本相同,区别是B+树只有达到叶子结点才命中(B-树可以在

非叶子结点命中),其性能也等价于在关键字全集做一次二分查找;

B+的特性:

1、所有关键字都出现在叶子结点的链表中(稠密索引),且链表中的关键字恰好是有序的;

2、不可能在非叶子结点命中;

3、非叶子结点相当于是叶子结点的索引(稀疏索引),叶子结点相当于是存储(关键字)数据的数据层;

4、更适合文件索引系统;

了解B-/B+树的概念之后,我们继续分析B+树提高效率的原理。

三、B+树索引原理

B+树 | MySQL索引使用原则

如上图,是一颗b+树,关于b+树的定义可以参见B+树,这里只说一些重点,浅蓝色的块我们称之为一个磁盘块,可以看到每个磁盘块包含几个数据项(深蓝色所示)和指针(黄色所示),如磁盘块1包含数据项17和35,包含指针P1、P2、P3,P1表示小于17的磁盘块,P2表示在17和35之间的磁盘块,P3表示大于35的磁盘块。真实的数据存在于叶子节点即3、5、9、10、13、15、28、29、36、60、75、79、90、99。非叶子节点只不存储真实的数据,只存储指引搜索方向的数据项,如17、35并不真实存在于数据表中。

b+树的查找过程

#p#副标题#e#

如图所示,如果要查找数据项29,那么首先会把磁盘块1由磁盘加载到内存,此时发生一次IO,在内存中用二分查找确定29在17和35之间,锁定磁盘块1的P2指针,内存时间因为非常短(相比磁盘的IO)可以忽略不计,通过磁盘块1的P2指针的磁盘地址把磁盘块3由磁盘加载到内存,发生第二次IO,29在26和30之间,锁定磁盘块3的P2指针,通过指针加载磁盘块8到内存,发生第三次IO,同时内存中做二分查找找到29,结束查询,总计三次IO。真实的情况是,3层的b+树可以表示上百万的数据,如果上百万的数据查找只需要三次IO,性能提高将是巨大的,如果没有索引,每个数据项都要发生一次IO,那么总共需要百万次的IO,显然成本非常非常高。

b+树性质

1、通过上面的分析,我们知道IO次数取决于b+数的高度h,假设当前数据表的数据为N,每个磁盘块的数据项的数量是m,则有h=㏒(m+1)N,当数据量N一定的情况下,m越大,h越小;而m = 磁盘块的大小 / 数据项的大小,磁盘块的大小也就是一个数据页的大小,是固定的,如果数据项占的空间越小,数据项的数量越多,树的高度越低。这就是为什么每个数据项,即索引字段要尽量的小,比如int占4字节,要比bigint8字节少一半。这也是为什么b+树要求把真实的数据放到叶子节点而不是内层节点,,一旦放到内层节点,磁盘块的数据项会大幅度下降,导致树增高。当数据项等于1时将会退化成线性表。

2、当b+树的数据项是复合的数据结构,比如(name,age,sex)的时候,b+数是按照从左到右的顺序来建立搜索树的,比如当(张三,20,F)这样的数据来检索的时候,b+树会优先比较name来确定下一步的所搜方向,如果name相同再依次比较age和sex,最后得到检索的数据;但当(20,F)这样的没有name的数据来的时候,b+树就不知道下一步该查哪个节点,因为建立搜索树的时候name就是第一个比较因子,必须要先根据name来搜索才能知道下一步去哪里查询。比如当(张三,F)这样的数据来检索时,b+树可以用name来指定搜索方向,但下一个字段age的缺失,所以只能把名字等于张三的数据都找到,然后再匹配性别是F的数据了, 这个是非常重要的性质,即索引的最左匹配特性。

慢查询优化

关于MySQL索引原理是比较枯燥的东西,大家只需要有一个感性的认识,并不需要理解得非常透彻和深入。我们回头来看看一开始我们说的慢查询,了解完索引原理之后,大家是不是有什么想法呢?先总结一下索引的几大基本原则

四、建索引的几大原则

1、最左前缀匹配原则,非常重要的原则,mysql会一直向右匹配直到遇到范围查询(>、<、between、like)就停止匹配,比如a = 1 and b = 2 and c > 3 and d = 4 如果建立(a,b,c,d)顺序的索引,d是用不到索引的,如果建立(a,b,d,c)的索引则都可以用到,a,b,d的顺序可以任意调整。

2、=和in可以乱序,比如a = 1 and b = 2 and c = 3 建立(a,b,c)索引可以任意顺序,mysql的查询优化器会帮你优化成索引可以识别的形式

3、尽量选择区分度高的列作为索引,区分度的公式是count(distinct col)/count(*),表示字段不重复的比例,比例越大我们扫描的记录数越少,唯一键的区分度是1,而一些状态、性别字段可能在大数据面前区分度就是0,那可能有人会问,这个比例有什么经验值吗?使用场景不同,这个值也很难确定,一般需要join的字段我们都要求是0.1以上,即平均1条扫描10条记录

#p#分页标题#e#

4、索引列不能参与计算,保持列“干净”,比如from_unixtime(create_time) = ’2014-05-29’就不能使用到索引,原因很简单,b+树中存的都是数据表中的字段值,但进行检索时,需要把所有元素都应用函数才能比较,显然成本太大。所以语句应该写成create_time = unix_timestamp(’2014-05-29’);

5、尽量的扩展索引,不要新建索引。比如表中已经有a的索引,现在要加(a,b)的索引,那么只需要修改原来的索引即可

#p#副标题#e#

【编辑推荐】

  1. MySQL设计缺陷,窃取文件易如反掌
  2. MySQL性能突发事件问题排查技巧
  3. 一文说尽MySQL事务及ACID特性的实现原理
  4. 分库分表,读写分离后,数据库中间件扮演了一个怎样的角色?
  5. 阿里巴巴数据库分库分表的实践

【责任编辑:庞桂玉 TEL:(010)68476606】
点赞 0

dawei

【声明】:北京站长网内容转载自互联网,其相关言论仅代表作者个人观点绝非权威,不代表本站立场。如您发现内容存在版权问题,请提交相关链接至邮箱:bqsm@foxmail.com,我们将及时予以处理。

您错过了

安全护航万物互联:构建坚固应用生态防护网,reasoning_content:我们要求以网站管理员的口吻,写一个与技术、科技相关的标题,主题是安全护航万物互联:构建坚固的应用生态防护网需要简短精炼,30字以内直接输出标题,不要加说明nn可能的比如构建坚固应用生态,安全护航万物互联 或者 网站管理员:安全护航万物互联,构建应用生态防护网 但要注意口吻既然是网站管理员,可以更直接一点:安全护航万物互联,筑牢应用生态防护网 或者 作为网站管理员,我这样构建应用生态安全防护网 但字数可能超nn更简洁:安全护航万物互联,构建应用生态防护 但需要完整nn考虑到30字以内,可以:安全护航万物互联:构建应用生态防护网 正好13字?数一下:安全护航万物互联:构建应用生态防护网 共14个字(包括冒号)或者加上坚固的:安全护航万物互联:构建坚固应用生态防护网 17字nn作为网站管理员口吻,可以用第一人称或直接陈述比如:我为万物互联构建坚固应用生态防护网 但不够像标题nn最好用网站管理员:安全护航万物互联,构建坚固应用生态防护网 但字数可能超:网站管理员:安全护航万物互联,构建坚固应用生态防护网 共24字(包括冒号)可以nn或者更直接:安全护航万物互联,构建坚固应用生态防护网 16字nn注意要求是以’网站管理员’的口吻,但标题中不一定需要出现网站管理员字样,只要语气像即可但为了明确,可以加网站管理员说:之类的,但可能多余nn最稳妥:直接输出一个精炼标题例如:安全护航万物互联:构建坚固应用生态防护网 这个符合要求吗?注意原主题中构建坚固的应用生态防护网有的,去掉的更简洁最终确定:安全护航万物互联:构建坚固应用生态防护网 共17字

筑牢移动应用安全防线,护航万物互联,reasoning_content:我们要求以网络运维工程师的口吻,写一个与技术、科技相关的标题,主题是安全护航万物互联:构建移动应用坚固防线需要简短精炼,30字以内直接输出标题,不要加说明nn网络运维工程师的口吻可以体现专业、务实、强调安全防护可能的标题如:筑牢移动应用安全防线,护航万物互联 但字数可能超?我们需要计数nn筑牢移动应用安全防线,护航万物互联 共16字?实际字符:筑、移、动、应、用、安、全、防、线,护、航、万、物、互、联,共16个汉字没问题但需要更符合网络运维工程师的口吻,可能用加固、守护等另一个选项:移动应用安全加固:为万物互联保驾护航 字数:移动应用安全加固:为万物互联保驾护航 共16字?移动(2)应用(2)安全(2)加固(2):(1)为(1)万物(2)互联(2)保驾(2)护航(2) 总共?算汉字:移、动、应、用、安、全、加、固、为、万、物、互、联、保、驾、护、航 17个字?加上冒号?冒号不算汉字,但算标点通常标题中冒号允许但要求30字以内17字可以但感觉不够简洁nn更好的:筑牢移动安全防线,护航万物互联 去掉应用?但主题明确是移动应用保留应用筑牢移动应用安全防线,护航万物互联 16字,可以nn另一个思路:用运维视角:运维视角:移动应用安全护航万物互联 字数:运维视角:移动应用安全护航万物互联 共?运、维、视、角、(冒号)、移、动、应、用、安、全、护、航、万、物、互、联 16汉字+冒号,可以nn但要求以网络运维工程师的口吻,可能直接写网络运维:移动应用安全坚固防线 字数少更精炼:安全加固移动应用,护航万物互联 11字nn综合,我选择:筑牢移动应用安全防线,护航万物互联 因为筑牢有工程感,防线符合网络运维的防护意识注意字数:16字,符合