【数据库分库】

数据库分表

当我们所使用的数据表所包含的信息太大,查询起来是很费时间的,这时候就需要进行一个分表的操作,首先建一个索引表,索引表中每个条信息记录主表所分的表名,主表分表根据需要设置对应大小子表的长度去分表,比如当子表长度达到1000条数据,就重新在创建出一个新子表。每次查询的时候,就可以先查询索引表找到对应的子表,然后查询子表,查询效率就会大大提高!

初始化

  1. 首先对索引表进行一个统计查询,如果统计数为0,说明当前没有子表,直接创建第一个新子表,如果不为0的话,我们把这个索引表的最后一条数据的子表名提取出来,对子表进行一个统计查询,检查子表长度是否超过预设值1000,如果超过就重新在创建一个新表,并把子表数据长度设为0。

int HistoryMan::indexInit()
{
    QSqlQuery sql_query;

    if (sql_query.exec("select count (*) from `data_index`")) {
       sql_query.next();
       int count = sql_query.value(0).toInt();

       qDebug()<<"data_index table size"<<count;

       if (count == 0) {
           createTable();
       } else{
           if (sql_query.exec("select * from `data_index`")) {
               sql_query.last();
               QString tableName = sql_query.value("data_table_name").toString();
               qDebug()<<"use data table"<<tableName;
               currentDataTableName = tableName;

               if (sql_query.exec(QString("select count(*) from `%1`").arg(currentDataTableName))) {
                   sql_query.next();
                   currentDataTableSize = sql_query.value(0).toInt();
               }
           }

           qDebug()<<"check";
           if (createTableCheck() == 0) {

           }
       }
    }
}


初始化流程图:

在这里插入图片描述

  1. 通过定时信号连接一个槽函数,槽函数执行内容,每次执行判断一次子表长度是否需要创建一个新的子表。然后将子表数据用json封装进行查询。
 connect(&pollingTimer, SIGNAL(timeout()),
            this, SLOT(pollingHandler()));

void HistoryMan::pollingHandler()
{
    createTableCheck(); //检查是否需要创建新表

    {
        QJsonObject obj;
        QJsonArray arrId;
        QJsonArray arrVal;
        foreach (dbDevDio *reg, db->getDevDioList()) {
            if (reg->getRecordFlag()) {
                arrId.append(reg->getId());
                arrVal.append(QVariant(reg->getValue()).toString());
            }
        }
        if ((!arrId.isEmpty()) &&
                (arrId.count() == arrVal.count())) {
            obj.insert("id", arrId);
            obj.insert("value", arrVal);
            writeData("dev_dio", 0, obj);
        }
    }
   ………     
    }
}

3.检查创建新的子表,如果子表长度超过预设值1000就创建一个新表

int HistoryMan::createTableCheck()
{
    if (currentDataTableSize >= db->sysParam.dataTableSize) {
       createTable();
       return 1;
    }

    return 0;
}

4.创建新子表,子表名根据当前时间去命名,在当前数据库下创建一个新的子表。并向索引表插入当前子表的信息。

int HistoryMan::createTable()
{
    QDateTime time = QDateTime::currentDateTime();
    QString currentTime = time.toString("yyyy-MM-dd_hh-mm-ss");
    QString tableName = QString("history_data_%1").arg(currentTime);

    QString sqlCmd = QString(
                " CREATE TABLE '%1' "
                " ( "
                " 'id' INTEGER PRIMARY KEY AUTOINCREMENT, "
                " 'dev_type' TEXT(64) NOT NULL, "
                " 'dev_id' integer(11) NOT NULL, "
                " 'data' TEXT(1024) NOT NULL, "
                " 'create_time' text(32) NOT NULL, "
                " 'upload_time' text(32), "
                " 'upload_flag' INTEGER(3) "
                " ); ").arg(tableName);

    QSqlQuery sql_query;


    if (sql_query.exec(sqlCmd)) {
     currentDataTableName = tableName;
     currentDataTableSize = 0;
     qDebug()<<"currentDataTableName:"<<currentDataTableName;
       sqlCmd = QString("INSERT INTO `data_index` (`start_time`, `data_table_name`) VALUES ('%1','%2')")
               .arg(time.toString("yyyy-MM-dd_hh:mm:ss"))
               .arg(tableName);

       if (sql_query.exec(sqlCmd)) {

       } else {
           qDebug()<<"insert table"<<tableName<<"failed"<<sql_query.lastError();
       }
    } else {
        qDebug()<<"create table"<<tableName<<sql_query.lastError();
    }
}

5.向数据库插入数据;

nt HistoryMan::writeData(QString devType, int devId, QJsonObject dataObj)
{
    QSqlQuery sql_query;

    qDebug()<<devType<<devId<<QString(QJsonDocument(dataObj).toJson(QJsonDocument::Compact));

    QString sqlCmd = QString("INSERT INTO `%1`"
                   "( dev_type, dev_id, data, create_time ) VALUES "
                   "('%2',%3,'%4','%5')")
                    .arg(currentDataTableName)
                    .arg(devType)
                    .arg(devId)
                    .arg(QString(QJsonDocument(dataObj).toJson(QJsonDocument::Compact)))
                    .arg(QDateTime::currentDateTime().toString("yyyy-MM-dd_hh:mm:ss"));

    qDebug()<<sqlCmd;

    if(!sql_query.exec(sqlCmd))
    {
        qDebug()<<sql_query.lastError();
    }

    currentDataTableSize++;

    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小飞爱学习1

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值