我有一个表,我想插入一些文件到它,然后我将有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();
1条答案
按热度按时间dojqjjoe1#
我不认为这是一个多线程问题,这是关于表锁。来自mysql文档;
innodb表的create index或alter table语句总是等待正在访问该表的当前正在执行的事务提交或回滚。
所以第二个线程将等待第一个线程的横切。
您可以考虑使用innodb快速创建索引。来自mysql文档;
可以使用一条ALTERTABLE语句在一个表上创建多个索引。这是相对有效的,因为表的聚集索引只需要扫描一次