首先是对于标题的回答:因为ElasticSearch不支持事务!
什么是ElasticSearch?
ElasticSearch是一个分布式,高性能,高可用,可伸缩,RESTful风格的搜索和数据分析引擎,是一款近实时的全文搜索引擎,从添加数据到搜索只有1秒的延迟,查询是实时的,这么强大的功能源于它的数据结构:倒排索引.但是ES是不支持事务的
何为全文搜索?
全文搜索是指计算机索引程序通过扫描文章中的每一个词,对每一个词都建立一个索引,并记录该词在文章中出现的次数(频率)和位置,当用户查询的时候,检索程序就根据事先建立的索引进行查找,并将查找的结构返回给用户.
何为倒排索引?
倒排索引是帮助ES找到目标数据的数据结构,也就是各种查询都是从倒排索引里面查询的,需要注意的是这里的索引并不是MySQL数据库里面的索引
倒排索引里面重要的元素有四个:词条,文档ID,频率和位置
词条:数据存在索引库中是需要分词的,这也是ES查询的快的原因之一,有很多分词器可以使用
文档ID:指的是这个词条所在的那一行的ID
频率:频率指的是这个词条出现的次数
位置:位置指的是这个词条出现在哪个具体的位置
试想,你一篇文章的数据都一个一个分词放在了库里,等你搜索的时候要找到这个词不就是简简单单的事儿吗?
为什么不用MySQL实现全文搜索?
MySQL是传统的关系型数据库,是当下web应用开发中最流行的关系型数据库.是支持事务的!但是MySQL也是有缺点的,如果需要全文进行模糊搜索,MySQL性能是非常低的.例如如下场景:
假如有一张手机信息表,里面有1亿的数据,我想要在从中搜索我想要的手机,比如"华为手机""1万元以下",如果用MySQL实现的话可能会这样写:select * from phone where phone_brand like "%关键词%".这样做理论上是可以查到相关数据的,但是如果我这时候想换个说法,换成"1万元以下"和"华为手机",只要调换个顺序,Like关键词就匹配不到了.而且LIKe是全表扫描的操作,数据量大的情况下这是非常消耗性能的.这时候就需要用到ElasticSearch来解决
ElasticSearch和MySQL在工作中的应用场景:先保存一份数据到MySQL,再保存一份到ElasticSearch,在ES中搜索
为什么ElasticSearch这么厉害不能取代MySQL?
MySQL虽然在数据全文检索方面显得有些力不从心,但是因为它的事务功能特性,可以保证不会出现脏数据.而ES并不支持事务,所以不是很适合存储原始数据.所以在工作中都是两个一起使用,一方面利用MySQL保证原始数据的安全性,另一方面利用ElasticSearch来进行全文搜索.