zoukankan      html  css  js  c++  java
  • 数据库优化小计

    周一夜间进行了一次XX业务相关的数据库表优化。


    原因:

    一共4张表,数据量不大,最小的40万记录,最大的300万,大小不超过300MB。但由于历史原因,表没有建立索引,对应的服务使用的SQL千姿百态,修改起来难度有点大,容易改错,涉及的全国客户较多,大部分都是全表扫描,在秒级的响应时间,但大多客户还能忍着。


    目标:

    对于此类无法通过建立索引提高响应速度的表,采用降低数据量,即水位线的方式,提高全表扫描的效率。


    方案:

    经过多次改进,行程可用的方案:

    第一部分:

    1、CREATE TABLE XXX_20130910 AS SELECT * FROM XXX;

    利用原表建立一个中间表。

    2、TRUNCATE XXX;

    Truncate原表。

    3、INSERT INTO XXX SELECT * FROM XXX_20130910 WHERE 7天;

    将7天的数据插入原表。

    此时启动相应服务,这个过程可以保证利用最短的时间恢复生产表的使用。

    第二部分:然后建立历史表:

    1、CREATE TABLE XXX_HISTORY AS SELECT * FROM XXX_20130910 WHERE 1<>1;

    利用中间表建立一个空的历史表。

    2、建立夜维,用于每天将生产表7天之前的数据导入历史表。

    整体操作完成后,用于生产的表保持7天的数据量,即使业务量增加,水位线也不会上升太多,保持在一定的高度。同时通过将生产表历史数据导入历史表的方式,既保证了历史数据的备份,也保证了生产表的数据量。


    上线:

    第一部分包括检查的时间总共耗时20分钟。与用户确认测试后开始第二部分,大约用时10分钟。


    效果:

    当天上线后的效果还可以,大多应用的响应时间从秒级,下降到xx毫秒级,有待一段时间内的查看。

    总结:

    整体过程经过来多次修改与总结,且为上线当天整理了步骤手册,标明了每步的操作以及注意的地方,所以操作当天比较顺手,主要是与多个客户联系停止应用、测试应用比较耗时,不同的客户配合的程度不同,不过还算是比较配合。

    对于数据库表的优化,以上操作其实已经精简到最简单的语句了,我觉得优化操作不在于多么的复杂,最重要的是简单、有效、安全,何况是没有用户驱动的优化,做好了可能不会说你什么,但做错了就有人叫了,得不偿失,因此不同的优化操作,可能选择的方法不同,但核心应该坚持“简单、有效、安全”,这样才能做到画龙点睛的效果。个人见解,欢迎拍砖!

  • 相关阅读:
    数据结构-向量
    可信执行环境(TEE)介绍 与应用
    ACM
    带哨兵节点和不带哨兵节点的单链表操作的对比
    java:Conllection(List,set,get,map,subList)使用
    java:在Conllection接口中实际上也规定了两个可以将集合变成对象数组的操作
    java:Conllection中的List,ArrayList添加元素,删除元素,输出元素
    java:类集框架conllection接口list,set
    java:投个票程序
    git:Git fetch和git pull的区别, 解决Git报错:error: You have not concluded your merge (MERGE_HEAD exists).
  • 原文地址:https://www.cnblogs.com/pangblog/p/3320063.html
Copyright © 2011-2022 走看看