首页 > 其他分享 >面试官:如果单表数据量过大怎么办?

面试官:如果单表数据量过大怎么办?

时间:2024-01-13 13:35:51浏览次数:25  
标签:面试官 old create 存储 单表 归档 table 量过大 where


面试官:如果单表数据量过大怎么办?_数据库

要回答这个问题,首先我们要明确这个表的数据是否全部有用?使用MySQL的过程,经常会遇到一个问题,比如说某张”log”表,用于保存某种记录,随着时间的不断的累积数据,但是只有最新的一段时间的数据是有用的;这个时候会遇到性能和容量的瓶颈,需要将表中的历史数据进行归档。

也就是说,大部分情况,我们做数据归档就足以解决这个问题。只有那些全部很重要的业务数据,才需要做分库分表。

利用存储过程和事件来定期进行数据的导出删除操作

1 、创建一个新表,表结构和索引与旧表一模一样

create table table_new like table_old;

2 、新建存储过程,查询30天的数据并归档进新数据库,然后把30天前的旧数据从旧表里删除

delimiter $

create procedure sp()

begin

insert into tb_new select * from table_old where rectime < NOW() - INTERVAL 30 DAY;

delete from db_smc.table_old where rectime < NOW() - INTERVAL 30 DAY;

end

3、创建EVENT,每天晚上凌晨00:00定时执行上面的存储过程

create event if not exists event_temp

on schedule every 1 day

on completion preserve

do call sp();

备注:第一次执行存储过程的时候因为历史数据过大, 可能发生意外让该次执行没有成功。重新执行时会遇到报错ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction,应急解决方案如下:

1、执行show full processlist;查看所有MySQL线程。

2、执行SELECT * FROM information_schema.INNODB_TRX; 查看是否有错误线程,即线程id在show full processlist;的结果中,状态为sleep的线程。

3、kill进程id。

另外写存储过程的时候可以控制事务的大小,比如说可以根据时间字段每次归档一天或者更小时间段的数据,这样就不会有大事务的问题,里面还可以加入日志表,每次归档操作的行为都写入日志表,以后查起来也一目了然。

面试官:如果单表数据量过大怎么办?_数据库开发_02

实战

首先,查看一下哪些表数据量特别大:

SELECT   
    TABLE_NAME AS '表名',  
    TABLE_ROWS AS '记录数'  
FROM   
    information_schema.TABLES   
WHERE   
    TABLE_SCHEMA = 'tms' and TABLE_ROWS > 1000;  -- 这里替换为你的数据库名

面试官:如果单表数据量过大怎么办?_数据库_03

如图,我要对原数据库中的single_packaging表进行归档,就先新建一个用于归档的数据库doc_history:

面试官:如果单表数据量过大怎么办?_数据_04

然后建一张一模一样的表在这个数据库,编写归档的存储过程:

delimiter $

create procedure sp()

begin

insert into doc_history.single_packaging select * from old_schema.single_packaging  where create_time < NOW() - INTERVAL 7 DAY;

delete from old_schema.single_packaging where create_time < NOW() - INTERVAL 7 DAY;


end

注意老库和新库的区别。

最后,设置事件,每天定时跑:

create event if not exists event_temp

on schedule every 1 day

on completion preserve

do call sp();

面试官:如果单表数据量过大怎么办?_存储过程_05

这样就OK了。

标签:面试官,old,create,存储,单表,归档,table,量过大,where
From: https://blog.51cto.com/u_10957019/9232000

相关文章

  • 面试官:单例Bean一定不安全吗?实际工作中如何处理此问题?
    默认情况下,SpringBoot中的Bean是非线程安全的。这是因为,默认情况下Bean的作用域是单例模式,那么此时,所有的请求都会共享同一个Bean实例,这意味着这个Bean实例,在多线程下可能被同时修改,那么此时它就会出现线程安全问题。Bean的作用域(Scope)指的是确定在应用程序中创建和......
  • 面试官:禁用Cookie后Session还能用吗?
    Cookie和Session是Web应用程序中用于保持用户状态的两种常见机制,它们之间既有联系也有区别。Cookie是由服务器在HTTP响应中发送给客户端(通常是浏览器)的一小段数据。客户端将这些信息保存在本地,并在后续的请求中自动将其发送回服务器。而Session是在服务器端创建的一......
  • 面试官:Java的Redis客户端如何选择
    一、客户端介绍Redis作为一个流行的开源内存键值数据库,拥有多个Java客户端,常见的包括:Jedis:这是最广泛使用的RedisJava客户端。它提供了一个小巧而且直接的API来与Redis交互。Lettuce:另一个流行的Java客户端,特别注重于可扩展性和性能。Lettuce基于Netty构建,支持......
  • 面试官:眉毛胡子一把抓,这就是你设计的项目结构
    Java经典项目目录结构大家好,我是JavaPub。很多刚工作的同学进入公司,拿到前辈们写的高级代码,眼前一亮希望可以从里边得到成长。今天和大家聊一聊Java项目目录结构。因为一些原因,我们在学校里学到的知识会滞后一些。但是好在万变不离其宗。接下来这个项目结构可以覆盖绝大多数项......
  • 面试官:眉毛胡子一把抓,这就是你设计的项目结构
    Java经典项目目录结构大家好,我是JavaPub。很多刚工作的同学进入公司,拿到前辈们写的高级代码,眼前一亮希望可以从里边得到成长。今天和大家聊一聊Java项目目录结构。因为一些原因,我们在学校里学到的知识会滞后一些。但是好在万变不离其宗。接下来这个项目结构可以覆盖绝大......
  • 面试官:做过支付资产?那先聊聊热点账户吧
    背景当前形势不佳,在这种情况下。小猫更是雪上加霜,他被裁了。投了个把月简历,终于约到一个面试。面试官翻了一下简历:“看你简历上写了支付和账户相关项目,那能否聊一下热点账户问题你们是咋处理的吧”。小猫懵逼了一会,“额?什么是热点账户?我们好像模型里面就一个资产账户,然后充值的......
  • 面试官:做过支付资产?那先聊聊热点账户吧
    背景当前形势不佳,在这种情况下。小猫更是雪上加霜,他被裁了。投了个把月简历,终于约到一个面试。面试官翻了一下简历:“看你简历上写了支付和账户相关项目,那能否聊一下热点账户问题你们是咋处理的吧”。小猫懵逼了一会,“额?什么是热点账户?我们好像模型里面就一个资产账户,然后充值的......
  • 面试官:做过支付资产?那先聊聊热点账户吧
    背景当前形势不佳,在这种情况下。小猫更是雪上加霜,他被裁了。投了个把月简历,终于约到一个面试。面试官翻了一下简历:“看你简历上写了支付和账户相关项目,那能否聊一下热点账户问题你们是咋处理的吧”。小猫懵逼了一会,“额?什么是热点账户?我们好像模型里面就一个资产账户,然后充值的......
  • 面试官:说一下MySQL主从复制的原理?
    MySQL主从复制(Master-SlaveReplication)是一种数据复制技术,用于在多个数据库服务器之间的数据同步。在主从复制架构中,一个服务器被设置为主服务器(Master),充当数据源,其他服务器被设置为从服务器(Slave),用来复制主服务器的数据。1.主从复制优点主从复制的主要优点有以下几个:高可......
  • 面试官:说说MVCC的执行原理?
    MVCC(Multi-VersionConcurrencyControl)是一种并发控制机制,用于解决数据库并发访问中,数据一致性问题。它通过在读写操作期间保存多个数据版本,以提供并发事务间的隔离性,从而避免了传统的锁机制所带来的资源争用和阻塞问题。所谓的一致性问题,就是在并发事务执行时,应该看到那些数......