SQL多表修改?
我理解题主问的是有100个表,这100个表结构完全一样,要给这100个表“同时”alter table,而不是在这100个表上面同时update数据。
结论是:没什么好的办法,只能挨个改。
这里面涉及两个问题:
1.表比较大的情况下,改表结构锁表时间很长;有主从同步的时候,改表会导致从库延迟。
这个可以用
pt-online-schema-change
来解决,可以把改表结构对线上系统的影响降到最低(用新结构建空表-逐条复制数据-rename,同时用触发器保证复制过程中对数据的增删改也应用到新表上,这些操作都可以不引起可观延迟地同步到从库)2.改表结构有先后,改的过程中不能保证每个分表结构一致。如果正常挨个改的话,不一致是肯定存在的,没法解决,只能让程序尽量兼容。或者用online-schema-change类似的思路,把改表的前两个步骤做了(建空表,复制并同步数据),最后统一rename,这样其实还是有一瞬间100个表不完全一致,但是能把不一致的时间缩短到最小。——以前某公司就有这样的100个表,而且 ORM还在内存中缓存了表结构,导致改表结构造成的影响很大。最早的时候一改表结构代码就报错,因为有表结构缓存,只要结构变了拼的SQL语句就会出问题,只能改完立刻重启web服务清除缓存。为了解决这个问题,就改用mysql返回的metadata来生成ORM对象,让读查询都脱离这个表结构缓存。然后对这种100个表不一致问题,在这100个表之外建一个单独的结构表xxx_struct,这个表不存数据,只用它来生成表结构缓存,在改表结构的流程上做个规范,加字段的时候先改存数据的表结构,然后再改_struct,删字段相反,总之保证_struct表比真实表字段少,就没啥问题了。MySQL和SQL的本质区别是什么?
一句话:sql是一种操作数据处理数据的语言,而mysql则是实现了sql规范解析sql的操作数据的客户端工具是一种关系型数据库应用软件.
而这些客户端有两大分类关系型和非关系型:关系型如mysql sqlserver oracle等 分关系型如:redis memcache mongdb等
SQL是关系数据库的标准语言。mysql属于关系数据库的一种,它是一个软件产品,和mysql像类似的有oracle sql server等,他们都属于关系型数据库使用的语言都是基于sql语言。
简单说:SQL是一种计算机语言,大多数多数据库管理系统都能运行这种语言,彼此的差别很小。而MySQL是一个数据库管理系统,这样的系统,最著名的比如有Oracle,微软的Ms SQLServer,IBM的DB/2,免费的如postgresql或者MySQL,这些数据库管理系统都运行SQL语言编写的程序。
Redis如何弥补传统MySQL架构的不足?
谈一下我的理解,如果有不对的地方,请留言指正。
MySQL+Redis
Redis自身是可以做数据持久化的,很多同学都会想Redis应该可以替代MySQL,但是我们使用一项技术、一个框架的时候,不是看它能不能,而是要看它适合不适合。
所以大多数公司的存储都是MySQL+Redis,MySQL(或者其他关系型数据库)作为主存储,Redis作为辅助存储,被用作缓存,这样可以加快访问读取的速度,提高性能。
Redis被用作缓存,以减少数据库IO的读操作,减轻数据库的压力,例如:
存储热点数据:经常会被查询,但是不经常被修改或者删除的数据;
计数器:诸如很多论坛用于统计点击数;
分布式锁及单线程机制;
最新列表、排行榜:请不要使用select top 10 from xxxx。
划重点,下面介绍一下缓存穿透
很多时候,程序员习惯先查询Redis,查询不到的话再去查询数据库,能查到的话再写入Redis中,认为这样不仅缓解了数据库的压力,同时也能保证数据的准确性。
但是由于缓存不命中就会查询数据库,如果一直查询不到的话,就导致每次请求都会查询数据库,如果短时间内有大量这样的请求,那么数据库可能会扛不住。
这就是缓存穿透。
其实应对的方法也很简单,查询不到的数据,也缓存到Redis中,并设置数据的过期时间。
举个不一定恰当的例子,例如Redis中缓存员工信息,提供接口根据工号查询员工信息:
接口入参工号A001。
系统先在Redis中查询,查询不到。
系统去数据库中查询,也查询不到。
系统插入Redis,key=A001,value=null,设置过期时间五分钟。
这样,五分钟之内再根据A001查询,不会穿透到数据库。
四分钟后,数据库中插入了A001的数据。
五分钟后,Redis中数据过期,下一次请求过来,会查询数据库,并把信息加载到Redis中。
希望我的回答,能够帮助到你!
我会持续分享Java程序开发、架构设计、职业发展等方面的知识和见解,希望能得到你的关注今日头条【会点代码的大叔】,转载请注明出处。
还没有评论,来说两句吧...