赞
踩
随着业务发展,数据量的增长,对数据全文检索
或模糊查询
显得普遍而重要。
这个时候Mysql就无法应对海量数据下各种复杂条件的查询。有人说加索引,加索引确实可以提升查询速度,但是索引也是成本,Mysql 中加多个索引最终在执行 SQL 的时候它只会选择成本最低的那个索引,如果没有索引满足搜索条件,就会触发全表扫描,出现慢sql等性能低下,而有些场景是加索引也解决不了的。
这样的话,我们可以借助搜索引擎,将数据发送到搜索引擎(如ES)上,由搜索引擎来提供专业的服务。而ES是搜索引擎中佼佼者,选用ES无疑是Mysql的一个有效补充。
这是一种最为简单的方式,在将数据写到mysql时,同时将数据写到ES,实现数据的双写。
优点:
缺点:
针对第一种同步双写的性能和数据丢失问题,可以考虑引入MQ中间件:
优点:
缺点:
上面两种方案中都存在硬编码问题,也就是有任何对mysq进行增删改查的地方要么植入ES代码,要么替换为MQ代码,代码的侵入性太强。
如果对实时性要求不高的情况下,可以考虑用定时器来处理,在 MySQL 的表结构里设置特殊的字段,增加一个字段为timestamp的字段,如 updated_at(数据的更新时间),任何crud操作都会导致该字段的时间发生变化。起一个定时任务,在用户低峰的时候,执行定时任务,去查询实际变更的数据,从而实现数据的增量更新到es中。这种方式可以使用开源的 Logstash 去完成。当然缺点也很明显,就是无法同步数据的物理删除操作。
优点:
缺点:
上面三种方案要么有代码侵入,要么有硬编码,要么有时延,所以通常我们利用mysql的binlog方式来进行同步。
Mysql 的 binlog 三种格式:
第一种:row 模式,binlog 按行的方式去记录数据的变更;
第二种:statement 模式,binlog 记录的是 SQL 语句;
第三种: mixed 模式时,混合以上两种,记录的可能是 SQL 语句或者 ROW 模式的每行变更;
show variables like 'log_bin';
查看binlog开启状态。
show variables like 'binlog-format';
查看binlog格式。
GRANT REPLICATION SLAVE ON *.* TO 'elastic'@'172.16.32.44'; GRANT RELOAD ON *.* TO 'elastic'@'172.16.32.44'; UPDATE mysql.user SET Super_Priv='Y' WHERE user='elastic' AND host='172.16.32.44';
优点:
缺点:
binglog其他详细解释参考博文:binglog详解
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。