MySQL 和 Elasticsearch 是两种不同的数据管理系统,它们各有优劣,实用于不同的场景。本文将从以下几个方面对它们进行比拟和剖析:
- 数据模型
- 查询语言
- 索引和搜寻
- 分布式和高可用
- 性能和扩展性
- 应用场景
数据模型
MySQL 是一个关系型数据库管理系统(RDBMS),它应用表(table)来存储结构化的数据,每个表由多个行(row)和列(column)组成,每个列有一个预约义的数据类型,例如整数、字符串、日期等。MySQL 反对主键、外键、束缚、触发器等关系型数据库的个性,以保证数据的完整性和一致性。
Elasticsearch 是一个基于 Lucene 的搜索引擎,它应用文档(document)来存储半结构化或非结构化的数据,每个文档由多个字段(field)组成,每个字段能够有不同的数据类型,例如文本、数字、布尔、数组等。Elasticsearch 反对动静映射(dynamic mapping),能够依据数据主动推断字段的类型和索引形式。
MySQL 和 Elasticsearch 的数据模型有以下几点区别:
- MySQL 的数据模型是严格的,须要当时定义好表的构造和束缚,而 Elasticsearch 的数据模型是灵便的,能够随时增加或批改字段。
- MySQL 的数据模型是二维的,每个表只有行和列两个维度,而 Elasticsearch 的数据模型是多维的,每个文档能够有嵌套的对象或数组。
- MySQL 的数据模型是关系型的,能够通过连贯(join)多个表来查问相干的数据,而 Elasticsearch 的数据模型是非关系型的,不反对连贯操作,须要通过嵌套文档或父子文档来实现关联查问。
举荐博主开源的 H5 商城我的项目 waynboot-mall,这是一套全副开源的微商城我的项目,蕴含三个我的项目:经营后盾、H5 商城前台和服务端接口。实现了商城所需的首页展现、商品分类、商品详情、商品 sku、分词搜寻、购物车、结算下单、支付宝 / 微信领取、收单评论以及欠缺的后盾治理等一系列性能。技术上基于最新得 Springboot3.0、jdk17,整合了 MySql、Redis、RabbitMQ、ElasticSearch 等罕用中间件。分模块设计、简洁易保护,欢送大家点个 star、关注博主。
github 地址:https://github.com/wayn111/waynboot-mall
查询语言
MySQL 应用规范的 SQL 语言来查问和操作数据,SQL 语言是一种申明式的语言,能够通过简洁的语法来表白简单的逻辑。SQL 语言反对多种查问类型,例如抉择(select)、插入(insert)、更新(update)、删除(delete)、聚合(aggregate)、排序(order by)、分组(group by)、过滤(where)、连贯(join)等。
Elasticsearch 应用 JSON 格局的查问 DSL(Domain Specific Language)来查问和操作数据,查问 DSL 是一种基于 Lucene 查问语法的语言,能够通过嵌套的 JSON 对象来构建简单的查问。查问 DSL 反对多种查问类型,例如全文检索(full-text search)、结构化检索(structured search)、地理位置检索(geo search)、度量检索(metric search)等。
MySQL 和 Elasticsearch 的查询语言有以下几点区别:
- MySQL 的查询语言是通用的,能够用于任何关系型数据库系统,而 Elasticsearch 的查询语言是专用的,只能用于 Elasticsearch 零碎。
- MySQL 的查询语言是字符串模式的,须要拼接或本义特殊字符,而 Elasticsearch 的查询语言是 JSON 模式的,能够间接应用对象或数组示意。
- MySQL 的查询语言是基于集合论和代数运算的,能够进行汇合操作和数学运算,而 Elasticsearch 的查询语言是基于倒排索引和相关度评分的,能够进行全文匹配和类似度计算。
索引和搜寻
MySQL 应用 B+ 树作为次要的索引构造,B+ 树是一种均衡多路搜寻树,它能够无效地存储和检索有序的数据。MySQL 反对主键索引、惟一索引、一般索引、全文索引等多种索引类型,以减速不同类型的查问。MySQL 也反对内部存储引擎,例如 InnoDB、MyISAM、Memory 等,不同的存储引擎有不同的索引和锁机制。
Elasticsearch 应用倒排索引作为次要的索引构造,倒排索引是一种将文档中的词和文档的映射关系存储的数据结构,它能够无效地反对全文检索。Elasticsearch 反对多种分词器(analyzer)和分词过滤器(token filter),以对不同语言和场景的文本进行分词和解决。Elasticsearch 也反对多种搜寻类型,例如布尔搜寻(boolean search)、短语搜寻(phrase search)、含糊搜寻(fuzzy search)、通配符搜寻(wildcard search)等,以实现不同精度和召回率的检索。
MySQL 和 Elasticsearch 的索引和搜寻有以下几点区别:
- MySQL 的索引是基于数据的值的,能够准确地定位数据的地位,而 Elasticsearch 的索引是基于数据的内容的,能够近似地匹配数据的含意。
- MySQL 的索引是辅助的,须要手动创立和保护,而 Elasticsearch 的索引是次要的,主动创立和更新。
- MySQL 的索引是部分的,只针对单个表或列,而 Elasticsearch 的索引是全局的,涵盖所有文档和字段。
分布式和高可用
MySQL 是一个单机数据库系统,它只能运行在一台服务器上,如果服务器呈现故障或负载过高,就会影响数据库的可用性和性能。为了解决这个问题,MySQL 提供了多种复制(replication)和集群(cluster)计划,例如主从复制(master-slave replication)、双主复制(master-master replication)、MySQL Cluster、MySQL Fabric 等,以实现数据的冗余和负载平衡。
Elasticsearch 是一个分布式数据库系统,它能够运行在多台服务器上,造成一个集群(cluster)。每个集群由多个节点(node)组成,每个节点能够承当不同的角色,例如主节点(master node)、数据节点(data node)、协调节点(coordinating node)等。每个节点能够存储多个索引(index),每个索引能够划分为多个分片(shard),每个分片能够有多个正本(replica)。Elasticsearch 通过一致性哈希算法(consistent hashing algorithm)来调配分片到不同的节点上,并通过心跳检测(heartbeat check)来监控节点的状态。如果某个节点呈现故障或退出集群,Elasticsearch 会主动进行分片的重新分配和均衡。
MySQL 和 Elasticsearch 的分布式和高可用有以下几点区别:
- MySQL 的分布式和高可用是可选的,须要额定配置和治理,而 Elasticsearch 的分布式和高可用是内置的,无需额定操作。
- MySQL 的分布式和高可用是基于复制或共享存储的,须要保证数据一致性或可用性之间的衡量,而 Elasticsearch 的分布式和高可用是基于分片和正本的,能够依据需要调整数据冗余度或容错能力。
- MySQL 的分布式和高可用是动态的,须要手动扩大或缩容集群规模,而 Elasticsearch 的分布式和高可用是动静的,能够主动适应集群变动。
性能和扩展性
MySQL 是一个面向事务(transaction)的数据库系统,它反对 ACID 个性(原子性、一致性、隔离性、持久性),以保证数据操作的正确性和完整性。MySQL 应用锁机制来实现事务隔离级别(isolation level),不同的隔离级别有不同的并发性能和一致性保障。MySQL 也应用缓冲池(buffer pool)来缓存数据和索引,以进步查问效率。MySQL 的性能次要取决于硬件资源、存储引擎、索引设计、查问优化等因素。
Elasticsearch 是一个面向搜寻(search)的数据库系统,它反对近实时(near real-time)的索引和查问,以保证数据操作的及时性和灵活性。Elasticsearch 应用分片和副原本实现数据的分布式存储和并行处理,不同的分片数和正本数有不同的写入吞吐量和读取提早。Elasticsearch 也应用缓存(cache)和内存映射文件(memory-mapped file)来减速数据和索引的拜访,以进步搜寻效率。Elasticsearch 的性能次要取决于集群规模、分片策略、文档构造、查问复杂度等因素。
MySQL 和 Elasticsearch 的性能和扩展性有以下几点区别:
- MySQL 的性能和扩展性是无限的,它受到单机资源、锁竞争、复制提早等因素的限度,而 Elasticsearch 的性能和扩展性是有限的,它能够通过减少节点、分片、正本等形式来程度扩大集群。
- MySQL 的性能和扩展性是以就义搜寻能力为代价的,它不能反对简单的全文检索和相关度评分,而 Elasticsearch 的性能和扩展性是以就义事务能力为代价的,它不能保证数据操作的原子性和一致性。
- MySQL 的性能和扩展性是以进步写入速度为指标的,它优化了数据插入和更新的效率,而 Elasticsearch 的性能和扩展性是以进步读取速度为指标的,它优化了数据检索和剖析的效率。
应用场景
MySQL 和 Elasticsearch 实用于不同的应用场景,依据不同的业务需要,能够抉择适合的数据库系统或组合应用两者。以下是一些常见的应用场景:
- 如果须要存储结构化或半结构化的数据,并且须要保证数据操作的正确性和完整性,能够抉择 MySQL 作为次要数据库系统。例如,电商网站、社交网络、博客平台等。
- 如果须要存储非结构化或多样化的数据,并且须要反对简单的全文检索和相关度评分,能够抉择 Elasticsearch 作为次要数据库系统。例如搜索引擎、日志剖析、举荐零碎等。
- 如果须要存储和剖析大量的时序数据,并且须要反对实时的聚合和可视化,能够抉择 Elasticsearch 作为次要数据库系统。例如,物联网、监控零碎、金融市场等。
- 如果须要同时满足上述两种需要,并且能够容忍肯定水平的数据不统一或提早,能够将 MySQL 作为主数据库系统,并将局部数据同步到 Elasticsearch 作为辅助数据库系统。例如新闻网站、电影网站、招聘网站等。
自此本文解说内容到此结束,感谢您的浏览,心愿本文对您有所帮忙。
关注公众号【waynblog】每周分享技术干货、开源我的项目、实战经验、高效开发工具等,您的关注将是我的更新能源!