数据库分表
当我们所使用的数据表所包含的信息太大,查询起来是很费时间的,这时候就需要进行一个分表的操作,首先建一个索引表,索引表中每个条信息记录主表所分的表名,主表分表根据需要设置对应大小子表的长度去分表,比如当子表长度达到1000条数据,就重新在创建出一个新子表。每次查询的时候,就可以先查询索引表找到对应的子表,然后查询子表,查询效率就会大大提高!
初始化
- 首先对索引表进行一个统计查询,如果统计数为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) {
}
}
}
}
初始化流程图:
- 通过定时信号连接一个槽函数,槽函数执行内容,每次执行判断一次子表长度是否需要创建一个新的子表。然后将子表数据用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;
}