百度算法

当前位置:

最左前缀索引、B+树提高面试速度,你怎么看?

浏览量:

对于某些事情,我们还不知道我们年轻的时候,但是到我们了解的时候,我们就不再年轻了。

有些事情在我们年轻的时候就无法理解,而在我们了解的时候不再年轻。

每天发自内心的话

生活中确实有太多不可逆转的苦难,很多事情和许多原因。如果您一直在考虑它,您将无法解决。如果您知道人们还活着,那就太好了。

来自:llc687 |编辑:乐乐

链接:/ post /如何完成快速查询

回顾过去:

身体

哪个男孩不想完成快速查询?

1.缓慢的MySQL查询的经验是什么?

谢谢你的邀请,利益相关。

大多数Internet应用程序场景涉及更多的阅读和更少的写作,并且业务逻辑在写作时更加分散。阅读的要求可能很快。那么,导致我们完成出色的慢查询的原因是什么?

1. 1索引

当数据量不是很大时,大多数慢查询都可以使用索引来解决,而大多数慢查询也是由不合理的索引引起的。

MySQL索引基于B +树。我相信这句话是在面试中记住的。然后,您可以询问最左边的前缀索引,B +树和各种树。

说到最左边的前缀,实际上是使用复合索引的规则。使用合理的复合索引可以有效提高查询速度。为什么?

因为索引被下推。如果查询条件包含在复合索引中,例如有一个复合索引(a,b),则查询满足a的记录后,将直接确定索引中是否满足b,并减少了返回表。同时,如果查询列恰好包含在组合索引中,则它是覆盖索引,无需返回表。索引规则估计是已知的,并将在实际开发中创建和使用。问题可能更多:为什么建立索引会很慢?

1. 1. 1是什么导致索引失败

建立索引后,索引仍然很慢。大部分索引无效(未使用),可以通过解释进行分析。索引失败的常见原因有:

用于!=或或或或表达式或函数(左侧)的地方

在类似语句%

的开头

未在字符串中添加

索引字段区分太低,例如性别

最左边的前缀不匹配

(一个嘴巴知道旧的面试问题)为什么这些做法会导致失败,成熟的MySQL也有自己的想法。

1. 1. 2为什么这些原因导致索引失败

如果您希望MySQL提供原因,它仍然是B +树。

功能操作

当在查询的左侧使用表达式或函数=时,如果字段A是字符串类型并具有索引,则存在一个查询,其中length(a)= 6,则索引树从6传递给A。很难想象迷失在树的第一层。

隐式转换

隐式类型转换和隐式字符编码转换也会导致此问题。

破坏秩序

至于Like语句的开头带有%且字符串未添加’的原因基本上是相同的。 MySQL认为对索引字段的操作可能会破坏索引的有序性,因此应进行明智地优化。

但是,对于性别差异过低的字段,索引失败并非出于此原因。

1. 1. 3为什么不索引性别字段?为什么不以低索引歧视性为该字段建立索引。盲目猜测是低效率的,的确是低效率的,有时甚至没有任何意义。

对于非聚集索引,必须返回该表。如果有100条数据,则会在“性别”字段中创建索引,并扫描51位男性,并且需要将51行扫描回表。最好直接扫描整个表。

因此,对于这种情况,InnoDB引擎将放弃使用索引。至于歧视的程度,它将放弃,大约当某种类型的数据约占总数的30%时,它将使用字段的索引放弃。如果您有兴趣,可以尝试一下。

1. 1. 4有什么有用且简单的索引方法

如前所述,大多数慢查询来自索引,以及如何良好地建立和使用索引。这是一些简单的规则。

1. 1. 5如何评估MySQL选择错误的索引

有时,乍一看,建立了一个看起来正确的索引,但是事情并没有按照计划进行。就像“为什么XXX为何有索引,根据该索引查询仍然很慢”。

此刻,也许可以更有信心:我的代码不能有bug,这一定是MySQL的问题。 MySQL确实可能有问题。

当建立许多索引并建立许多查询条件时,这种情况很常见。您没有选择要使用的图像,而是选择了低分辨率的图像,从而导致扫描过多。基本上有两个原因:

但是根据我的浅浅经验,您更有可能建立了一些不必要的索引。难道没有人真的认为MySQL不聪明吗?

除了上述索引原因外,还有以下一些不常见或难以判断的原因。

1. 2和其他MDL锁

在MySQL 5. 5版本中,引入了MDL。在表上执行CRUD操作时,将自动添加MDL读锁定;当表结构更改时,将添加MDL写锁。读写锁和写锁是互斥的。

在官方帐户的顶级架构师后台响应“清理结构”,并获得惊喜套餐。

当一条语句持有MDL写锁时,它将阻塞MDL读锁。您可以使用show processlist命令在“等待表元数据锁定”状态下查看该语句。

1. 3等冲洗

刷新非常快,主要是因为flush命令被其他语句阻止,从而再次阻止了选择。当您查看show processlist命令时,您会发现它处于“等待表刷新”状态。

1. 4个相等的行锁定

某些东西具有写锁,尚未提交。

1. 5当前已读

InnoDB的默认级别是可重复读取。设想一个场景:事务A开始事务,事务B也开始执行大量更新。 B是第一个提交的对象,而A是当前的读取对象,因此必须依次执行undo日志,直到找到事务B开始之前的值为止。

1. 6个大桌子场面

在没有二次开发的MYSQL中,数亿张表必须视为大表。即使索引和查询级别实现得很好,面对频繁的聚合操作,也可能存在IO或CPU瓶颈。即使是简单的查询,效率也会降低。

Innodb中每个B +树节点的存储容量为16 KB,理论上它可以存储大约2kw行,此时树的高度为3级。我们知道innodb_buffer_pool用于缓存表和索引。如果索引数据很大,则高速缓存命中率令人担忧。同时,innodb_buffer_pool使用LRU算法消除页面。如果数据量太大,则对旧数据或非热数据的查询可能是热数据被挤出。

因此,大型表的常见优化是数据库和表的分离以及读写的分离。

1. 6. 1子库和子表计划

是子数据库还是子表?这需要具体的分析。

级别是拆分数据并将原始数据分散到更多数据库表中。在垂直方向上,数据库是根据业务划分的,而表是根据字段划分的。

在工具方面,有分片范围,TDDL,Mycat。首先,您需要首先评估子数据库和表的数量,制定分片规则以选择键,然后进行开发和数据迁移,还要考虑扩展问题。

问题

在实际操作中,书写问题并不大。主要问题在于唯一的ID生成,非分区键查询和容量扩展。

当然,如果您是子数据库,您还将面临事务一致性和跨数据库联接之类的问题。

1. 6. 2读写分离为什么需要读写分离

子表解决了大型表的CPU瓶颈,子库解决了IO瓶颈,这两者都解决了存储压力。但是查询不一定。

如果DB的QPS仍然很高,并且读取的数据远大于写入的数据,则可以考虑将读取和写入分开。基于主从模式,读取压力被共享,以避免单台机器上的过多负载,同时确保高可用性。负载均衡。

问题

主要问题是逾期的阅读和分配机制。

1. 7摘要

上面列出了MySQL中常见的慢速查询的原因和处理方法,并介绍了处理较大数据场景的常见方法。

子数据库,子表和读写分离针对大数据或并发方案,但也旨在提高系统的稳定性和可伸缩性。但并非所有问题都最适合以这种方式解决。

2.如何评估ElasticSearch

如前所述,ES可用于关键字查询。然后谈论ES。

2. 1能做什么

ES是基于Lucene的近实时分布式搜索引擎。使用方案包括全文搜索,NoSQL Json文档数据库,监视日志,数据收集和分析等。

对于非数据开发,最常用的应该是全文搜索和日志。在使用ES时,它通常与Logstash和Kibana结合使用,成为ELK。让我们先看看如何使用日志。

以下是我们公司的日志系统的搜索操作:打开Kibana,然后在“发现”页面上以“ xxx”之类的格式输入查询。

此操作可以在开发工具控制台中替换为:

获取yourIndex / _search

{

“来自”:0,“尺寸”:10,

“查询”:{

“ match_phrase”:{

“日志”:“ xxx”

}

}

}

你是什么意思?在Discover中添加“”和在控制台中添加match_phrase表示这是词组匹配,这意味着仅保留那些包含所有搜索词并且其位置与搜索词相同的文档。

2. 2 ES结构

在ES 7. 0之前,存储结构为索引->类型->文档,根据MySQL的比较是database-table-id(实际比较不太合理)。在7. 0类型过时之后,让我们暂时将索引用作表。

在Dev Tools Console中,您可以使用以下命令查看一些基本信息。也可以用crul命令代替。

获取/ _cat / health?v&pretty:查看集群的健康状态

获取/ _cat / shards?v:查看碎片状态

获取您的索引/映射:索引映射结构

获取您的index / _settings:索引设置结构

GET / _cat / indices?v:查看当前节点的所有索引信息

重点是映射和设置。映射可以理解为MySQL中表的结构定义,而设置负责控制分片的数量和副本的数量。

在正式帐户“程序员”小乐中回应“ Java”,并获得惊喜的Java面试问题和答案包。

以下是日志索引下映射结构的一部分的屏幕快照。 ES默认将字符串类型定义为文本,并为其定义一个名为关键字的子字段。两者之间的区别是:文本类型将执行分词,而关键字类型将不进行分词。

“ ******”:{

“映射”:{

“ doc”:{

“属性”:{

“ appname”:{

“类型”:“文本”,

“字段”:{

“关键字”:{

“类型”:“关键字”,

“ ignore_above”:256

}

}

2. 3为什么ES查询速度很快?

分词是什么意思?阅读完ES索引原则,您就可以得到。

ES基于倒排索引。你什么意思?传统索引通常使用文档ID作为索引,使用内容作为记录。相反,倒排索引用于根据现有属性值查找对应行的位置,即以单词或内容作为索引,以文档ID作为记录。

下图是ES倒排索引的示意图,它由术语索引,团队字典和发布列表组成。

全文检索搜索引擎

图片中的Ada和Sara称为术语,实际上是分词之后的单词。如果图中的术语索引被删除,是否有点像MySQL?术语词典就像二级索引,但是MySQL存储在磁盘上。检索术语需要几次随机访问磁盘操作。

[声明]本网转载网络媒体稿件是为了传播更多的信息,此类稿件不代表本网观点,本网不承担此类稿件侵权行为的连带责任。故此,如果您发现本网站的内容侵犯了您的版权,请您的相关内容发至此邮箱【83030543@qq.com】,我们在确认后,会立即删除,保证您的版权。