one
约 2766 字大约 9 分钟
2025-07-04
1、自我介绍
2、项目介绍
- 95值示例(简历里写了有关95值轻微洁癖)
3、ElasticSeach相关
- 排序机制-打分
- 分词策略
- 倒排索引
4、MySQL相关
慢查询如何优化
MySQL5.7所有索引类型
数据太多的分库分表
- 垂直分表和水平分表的介绍和区别
- 分表维度(hash取余、步长、业务区分)
- 给业务带来的影响
5、是否处理过内存溢出或相关问题
6、是否使用过docker和k8s
- docker和传统虚拟机相比有什么优势
- docker文件的介绍
7、场景题
- 五台机器定时任务,如何让它每次执行只会有一台执行到该任务
8、习惯的开发流程
9、非技术问题
- 是否做过技术分享
- 是否有习惯写博客
10、你有什么想问的
二面:组长面
1、自我介绍(不要只介绍自己的项目经历,兴趣爱好也介绍一下)
2、介绍一下最近参与的项目,在其中遇到的困难以及解决方式,自身最大的收获
3、简历中介绍了带领团队拿到了整个研发组代码质量的第一名,介绍下是怎么拿到的,为什么能拿到
4、三到五年的职业规划
5、你有什么想了解的
没有什么技术上的交流,主要是了解个人的项目经历、收获等
回答
1、略
2、略
ElasticSeach相关
ElasticSeatch 是一个开源的全文搜索引擎。支持分布式搜索、分析和存储。排序机制是其搜索功能的关键部分
- 基于评分的排序:ES默认排序是基于文档的相关性评分进行的。他使用的TF-IDF算法(词频-逆文档频率)来计算每个文档的相关性评分,并根据这个分数来排序返回结果。
- 自定义排序字段:除了基于评分的排序外,ES还允许指定字段的值进行排序。可以指定单个或多个字段(日期、数字、字符串都可)选择升序还是降序排序
- 复合排序:可以使用多个字段来进行排序,可以按照多个字段的组合顺序设置不同的字段的优先级排序和排序方向
- 基于脚本的排序:ES支持通过自定义脚本来定义排序规则。
- 分布式排序:ES是一个分布式系统,它能够处理大规模的数据和查询。在进行排序时,它会在分布式节点之间协调并合并排序结果。
TF算法:即词频,表示词条在文本中出现的频率。和搜索关键词在一个文档中出现的次数成正比
IDF算法:即逆文档频率,反应了一个词在所有文档出现的频率。和搜索关键词在所有文档中出现的频次成反比
Elasticsearch 中的分词策略是指将文本数据分解成单独的词项(tokens)或者词汇单元(terms),这些词项是搜索引擎用于索引和搜索的基本单位。
下面是一些ES中常见的分词策略:
- 标准分词器(Standard Analyzer): 这是 Elasticsearch 默认的分词器。它基于 Unicode 文本分割算法进行分词,去除标点符号和空格,将词汇转换为小写形式,并且支持词干化(stemming)和停用词过滤(stop words filtering)。
- 简单分词器(Simple Analyzer): 简单分词器按照非字母字符进行分割,将文本转换为小写,并去除停用词。这个分词器适合对语言和语法不太复杂的文本进行分析。
- 语言分词器(Language Analyzers): Elasticsearch提供了许多针对特定语言优化的分词器,如英文、中文、法文等。这些分词器考虑了特定语言的规则和特性,能够更好地处理相应语言的分词需求。
- 自定义分词器(Custom Analyzer): Elasticsearch允许用户根据特定的需求自定义分词器,可以组合不同的字符过滤器(character filters)、分词器(tokenizer)和词项过滤器(token filters)来构建符合实际需求的分词策略。
- Edge N-gram 分词器: 这种分词器创建了词项的前缀,用于实现基于前缀的搜索。例如,可以将单词 "search" 分成 "s", "se", "sea", "sear", "searc", "search" 等前缀形式。
倒排索引(Inverted Index)是 Elasticsearch 中用于实现全文搜索的核心数据结构之一。它的设计思想是将文档中的词项(terms)与文档的对应关系建立索引,以支持快速的文本搜索。
以下是倒排索引的基本原理和特点:
- 词项与文档的映射关系: 倒排索引以词项为键(terms),将每个词项与包含这个词项的文档列表建立映射关系。这使得搜索时可以快速地定位包含特定词项的文档。
- 支持全文搜索: 倒排索引能够支持全文搜索,即用户可以搜索文档中的任意词项,而不仅限于文档标题或特定字段。它不仅记录了词项出现在哪些文档中,还记录了词项在文档中的位置等信息,以提供更准确的搜索结果。
- 高效的检索和聚合操作: 倒排索引允许快速地定位包含特定词项的文档,这使得搜索操作变得非常高效。此外,它也支持聚合操作,可以用于计算词项的频率、统计文档数等。
- 支持多字段搜索和复杂查询: Elasticsearch 的倒排索引支持在多个字段上执行搜索操作,还能够处理复杂的布尔查询、范围查询、模糊查询等复杂查询需求。
倒排索引是Elasticsearch高效进行文本搜索的关键组件之一,它通过将文档的词项与文档的对应关系进行倒置,使得搜索和检索操作变得非常高效。倒排索引的设计和优化对于搜索引擎的性能和效率至关重要。
MySQL相关
- 索引优化:使用EXPLAIN语句分析慢查询sql的查询计划,检查是否使用了正确的索引,分析是否存在索引优化的空间。
- 查询字段很少,是否存在使用覆盖索引的可能。从而避免回表操作
- 优化查询语句:确保查询语句搞笑。尽量避免全表扫描、使用select *、避免使用 %like 左模糊查询等。
- 表结构和数据类型优化:
- 避免使用过大的数据类型 比如:TEXT
- 过于大的表可以考虑分库分表
- 连表复杂的情况可以考虑使用数据冗余的方式避免连表操作
- MySQL参数调优:根据实际情况考虑来动态调整MySQL参数,如:连接数,缓存池大小等
- 使用缓存:使用缓存能有效减少数据库的压力
- 业务改造
- B-tree 索引: B-tree(Balanced Tree)是最常见的索引类型,用于普通的索引和唯一索引。它适用于等值查询、范围查询和排序操作。
- 哈希索引: 哈希索引适用于等值查询,但不支持范围查询和排序操作。MySQL 5.7的哈希索引只能用于Memory引擎表(不支持InnoDB)。
- 全文索引(Full-Text Index): 全文索引适用于全文搜索,允许对文本内容进行全文搜索和匹配。它适用于对文本字段进行关键词搜索的场景。
- 空间索引(Spatial Index): 空间索引用于优化空间数据类型的查询,例如地理位置信息、地图坐标等。MySQL 5.7支持的空间索引基于R-Tree数据结构。
- 前缀索引(Prefix Index): 前缀索引允许在不完全存储列值的情况下创建索引,只索引列值的前缀部分。这种索引可以减少索引的存储空间和提高查询性能。
- 复合索引(Composite Index): 复合索引是指在多个列上创建的组合索引。它可以提高查询效率,尤其适用于联合查询或包含多个条件的查询。
- 虚拟列索引(Generated Column Index): 虚拟列索引基于虚拟列(Generated Column)创建的索引。虚拟列是根据表中其他列计算出来的值,可以针对这些虚拟列创建索引。
数据太多的分库分表
- 垂直分表是指将不同的列放入不同的表。如:订单表、订单商品表
- 水平分表是指将不同的行根据特定的规则放入不同的表
- 垂直分库是指根据业务类型将表进行区分,实现专库专用,比如:用户相关库、订单相关库
- 水平分库是指按特定规则将表内数据分到不同的库。如根据创建时间分为冷库和热库
- 根据字段(时间(冷库、热库);主键(Hash取余、步长);范围(id 1~100000、100000 ~ 200000)分表)
- 根据业务区分表,比如:湖南用户hunan表,江西用户jiangxi表
- 分表困难,需要进行内存分页
- 查询性能:连表的情况得在内存中做数据匹配
- 贸然的分表可能会导致业务逻辑变更
5、略
Docker和传统虚拟机的区别
特征 | 传统虚拟机 | Docker容器 |
---|---|---|
资源利用率 | 每个虚拟机有独立操作系统,资源消耗大 | 共享宿主机内核,资源消耗较小 |
启动时间 | 需要较长时间启动完整的操作系统 | 启动速度快,仅加载应用程序和依赖 |
资源占用 | 需要更多内存和存储空间 | 更高效地利用内存和存储空间 |
隔离性 | 提供较高的隔离性 | 隔离性相对较低,但对于大多数场景足够 |
五台机器定时任务,如何让它每次执行只会有一台执行到该任务
最简单也是最容易想到的:分布式锁
- 利用所有可以共同访问的存储都可以实现,比如mysql,利用事务+前后判断
借鉴Redis的哨兵机制,选举机制
- 需要借助中间服务,网络io变多很多
8、略
二面略