与qt并行向mysql表添加一些索引

2skhul33  于 2021-06-24  发布在  Mysql
关注(0)|答案(1)|浏览(407)

我有一个表,我想插入一些文件到它,然后我将有30000000条记录。插入后,我会反复分析表。所以我在表中添加了一些索引以增加访问时间。但是添加这些索引会减少插入时间,对于3000万条记录来说,这需要很长时间。作为下面的链接,首先我想插入到没有索引的表中,然后我想并行地向表中添加一些索引(即8个线程)。
在此处输入链接说明,然后在此处输入链接说明
所以我为每个线程创建了一个连接,并用 CREATE INDEX 在单独的线程中进行查询,但我看到索引是按顺序添加的,因为创建每个索引需要大约35秒,所以创建8个索引需要大约5分钟(而不是30秒)。有什么问题?
这是我的多线程类:
索引B.h

class IndexToDB : public QThread
{
    Q_OBJECT

private:
    QString connectionName_;
    QString str_;

public:
    IndexToDB();
    ~IndexToDB();
    void setParams(QString connectionName,QString str);

private slots:
    void run();
};

索引数据库.cpp

IndexToDB::IndexToDB()
{

}

IndexToDB::~IndexToDB()
{

}

void IndexToDB::setParams(QString connectionName,QString str)
{
    connectionName_=connectionName;
    str_=str;

}

void IndexToDB::run()
{   
    QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL",this->connectionName_);
    db.setHostName("...");
    db.setDatabaseName("...");
    db.setUserName("...");
    db.setPassword("...");

    QSqlQuery query(db);
    query.prepare(this->str_);
    query.exec();
}

然后我在 mainwindow.cpp 具体如下:

IndexToDB**itdb=new IndexToDB*[8];

itdb[0]=new IndexToDB();
itdb[0]->setParams("connection0","CREATE INDEX `index0` on tempTBL (`col1`,`col2`,`col3`);");
itdb[0]->start();

...

tdb[7]=new IndexToDB();
itdb[7]->setParams("connection7","CREATE INDEX `index7` on tempTBL (`col10`,`col12`);");
itdb[7]->start();
dojqjjoe

dojqjjoe1#

我不认为这是一个多线程问题,这是关于表锁。来自mysql文档;
innodb表的create index或alter table语句总是等待正在访问该表的当前正在执行的事务提交或回滚。
所以第二个线程将等待第一个线程的横切。
您可以考虑使用innodb快速创建索引。来自mysql文档;
可以使用一条ALTERTABLE语句在一个表上创建多个索引。这是相对有效的,因为表的聚集索引只需要扫描一次

相关问题