楔子
ES全名elasticsearch翻译过来是弹性搜索;从名字直观的了解,这个东西是解决搜搜的问题;
作为一个经常写SQL的人来说;搜索在我的映像中就是select * from table where,那为什么还要ES?
当数据变多时,原有方案开始变得糟糕
mysql对于一些较为固定,字段较少的查询方式,可以通过简单的增加索引来完成优化,在大多数公司,即使你对索引优化不熟悉,也有专门的dba来帮你完成一些简单的优化。甚至有些电商公司要求程序中不允许出现orm,必须用纯sql来完成业务逻辑,这样dba可以直接介入到代码中来。
不过到字段太多的时候这招就不灵了,字段越多,查询自然就越慢(比如单条记录可能都超过了4k什么,甚至有些oracle的表里,一个字段就有几兆信息,当然几兆信息的这种这里也解决不了,嗯)。
mysql表在普通查询过程中,比如select * from xxx limit 100w, 100;这种,小网站随便写sql,可能不会体会到翻页的痛。但你在一个单表3000w的系统中写了limit 10000000, 10。那数据库服务器就哭了。因为实际上数据库为了取出你想要的那几条数据,需要把所有的数据也就是10000010条都取到内存中,复杂一点的select再加上order by则可能会同时涉及到多次磁盘读取和文件排序。慢上加慢。
除此之外,现在最流行的innodb之类的存储引擎在计算count的时候非常的慢。当然了,网络上会有人从乱七八糟的文章里看到换myisam应该就会更快的结论,但这其实是错的。如果在select语句的where条件中也有表达式时,这两种