以上的操作位于:base 1亿条记录,总共:140gb,同时使用压力测试工具不断的往数据库中以每5秒进5000条数据的速度插入新数据,master slaver主从情况下,在64c cpu, 256gb ram,ssd磁盘执行情况:
对于delete from user_behavior_logs where created_datetime between '2020-04-07 09:00:00' and '2020-08-07 14:00:00'; 要删除的数据多达:170w条,需要保留的有9000w条。
用mysqldump导出和恢复9900w条记录总计用了:3小时,从库每3分钟报一次主从同步,连续了3小时直到mysqldump把9900w条记录导入了新表才告终目。而后续的rename表名和drop都是秒级,期间无任务报警。
结论
这种手法,只有在非营业时间去做,并且这点时间是完全可以忍受的,但是这种需求只应该每半年或者季度发生一次。
我可以帮你优化这个问题,首先要查询MySQL语句,可以使用SELECT语句,结合其他关键字和函数,实现不同种类的查询。
针对第六章课程中的17种查询语句,可以分组为单语句查询和多语句查询,其中单语句查询包括简单查询、条件查询、排序查询、限制查询、分组查询、聚合函数查询和子查询;而多语句查询包括联合查询、嵌套查询和存在查询。
以下是具体的解决方案:
示例代码:
SELECT column1, column2, ... FROM table_name;
示例代码:
SELECT column1, column2, ... FROM table_name WHERE condition;
示例代码:
SELECT column1, column2, ... FROM table_name ORDER BY column1 ASC (or DESC);
示例代码:
SELECT column1, column2, ... FROM table_name LIMIT num;
示例代码:
SELECT column1, column2, ... FROM table_name GROUP BY column1;
示例代码:
SELECT COUNT(column1), AVG(column2), SUM(column3) FROM table_name;
示例代码:
SELECT column1, column2, ... FROM table_name WHERE column1 IN (SELECT column1 FROM table_name2 WHERE condition);
示例代码:
SELECT column1, column2, ... FROM table_name1
UNION
SELECT column1, column2, ... FROM table_name2;
示例代码:
SELECT column1, column2, ... FROM table_name WHERE column1 IN (SELECT column1 FROM table_name2 WHERE condition);
示例代码:
SELECT column1, column2, ... FROM table_name WHERE EXISTS (SELECT column1 FROM table_name2 WHERE condition);
针对以上查询语句,可以通过优化查询语句、建立索引、调整服务器参数等方法,提高查询效率。同时,需要注意不命中索引的情况,优化查询条件和数据存储方式,避免出现性能瓶颈。
另外,需要注意MySQL的隔离级别和锁机制,尤其是在当前读和可重复读的情况下,避免出现幻读问题,可以采用间隙锁等方法来解决。