问题:为什么在并行执行时连接几乎空表的查询的MySQL性能会下降?
下面是我正面临的问题的更详细解释.我在MySQL中有两个表
CREATE TABLE first (
num int(10) NOT NULL,
UNIQUE KEY key_num (num)
) ENGINE=InnoDB
CREATE TABLE second (
num int(10) NOT NULL,
num2 int(10) NOT NULL,
UNIQUE KEY key_num (num, num2)
) ENGINE=InnoDB
Run Code Online (Sandbox Code Playgroud)
第一个包含大约一千条记录.第二个是空的或包含很少的记录.它还包含双重索引,它在某种程度上与问题有关:单个索引的问题就消失了.现在我试图并行地对这些表进行大量相同的查询.每个查询如下所示:
SELECT first.num
FROM first
LEFT JOIN second AS second_1 ON second_1.num = -1 # non-existent key
LEFT JOIN second AS second_2 ON second_2.num = -2 # non-existent key
LEFT JOIN second AS second_3 ON second_3.num = -3 # non-existent key
LEFT JOIN second …
Run Code Online (Sandbox Code Playgroud) 我正在使用QMYSQL连接到本地数据库.该应用程序运行在多个线程上.每个线程使用独立连接连接到数据库.当我尝试连接数据库时,有时Qt会抛出以下错误.有什么问题?
QMYSQL: Unable to allocate a MYSQL object
Run Code Online (Sandbox Code Playgroud)
更新
添加了用于连接的代码.此对象被移动到一个线程,该连接被命名.critical
是一个发送到主窗口的信号,用于在发生严重错误(显示消息)后终止应用程序执行.log
是一个发出的信号,用于将事件记录到数据库中.
void ClientWorker::connect() {
m_database = QSqlDatabase::addDatabase("QMYSQL","wsc");
m_database.setHostName(m_host);
m_database.setDatabaseName(m_databaseName);
m_database.setPort(m_port);
m_database.setUserName(m_db_username);
m_database.setPassword(m_db_password);
if(!m_database.open()) {
QString error = "Unable to connect to database. Reason:\n";
error+= m_database.lastError().text();
log("Unable to connect to database! ", error, "ERROR" );
emit critical(tr("Database Error!"),error);
} else {
log("Connected to datbase successfully.", "", "NOTICE" );
}
Run Code Online (Sandbox Code Playgroud)
更新2
我刚刚意识到,每次从主线程建立连接时(主踏板中没有活动连接),驱动程序都无法加载.我刚刚添加了一个小的虚拟连接代码,main()
它连接并立即断开连接(在任何线程连接之前).添加该代码,一切正常.我不确定为什么线程在主线程中的连接之前无法连接,但我认为它看起来像一个bug.希望这有助于某人,花了3天时间:/