如何简单粗暴的优化一张数据量增长很快的千万级大表?
当一张表的数据量达到千万级别的时候,任何对表的操作都得小心翼翼。核心点在于避免全表扫描、避免锁表、避免产生大量行锁。
本质上是让每一次sql的执行都更快的完成,避免过长时间占用数据库连接,让连接能够迅速的释放回数据库连接池,提供更多稳定的服务。
一旦产生大量的行锁甚至表锁,将会带来连接瞬间被打满、数据库资源耗尽、服务宕机的灾难性后果。所以如何避免以上问题的发生才是最重要的,绝不能等问题发生之后再去解决。
SQL查询的执行路径:
sql优化所有sql必须命中索引,禁止全表扫描
禁止like查询,会导致全表扫描
where条件必须符合最左前缀查询原则,会无法命中索引,全表扫描
禁止使用!=、<>、OR等操作符,会导致全表扫描
禁止参与列运算例如:sum、date_format,会导致全表扫描
禁止使用is null、is not null等空判断,会导致全表扫描
禁止使用select *,应该明确指定要查询的列,避免大批量数据传输、磁盘读写
用exist代替in
禁止大表连接查询
结构优化避免大字段和核心数据存储在一张表,可以考虑将大字段拆出来存储到OSS、ES、openSearch等数据源中,通过主键关联的形式查询。
一主多从,读写分离,缓存主从配置可以支持更多的数据连接,避免了单机连接不足的问题,读写分离可以让读业务走从库,不同的业务走不同的数据库,比如报表业务。
分区分表分区分表基本上就是终极方案了,水太深,这里不细说了。
以上,纯属扯淡!回到题主的问题,简单粗暴的方案是啥?数据库内存加大!128G、256G上!硬盘采用SSD!一主多从、读写分离,借助阿里云RDS轻松完成,有钱就可以了,分区分表?那就不叫简单粗暴了!几千万数据?so easy!
大家有什么好的简单粗暴的方案?欢迎评论区交流讨论~
Copyright © 广州京杭网络科技有限公司 2005-2024 版权所有 粤ICP备16019765号
广州京杭网络科技有限公司 版权所有