быстрый способ обновить 10M запись в базе данных Mysql, используя QT - PullRequest
0 голосов
/ 05 апреля 2020

У меня есть файл размером 500 МБ, который содержит данные, которые мне нужны для обновления таблицы, содержащей 10 миллионов строк, поэтому я использую этот код при использовании библиотеки QT SQL

QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL");
// my database info 
db.transaction(); // start the transaction
    QSqlQuery q;
    QString sql = ""; // to append many sql statment to this string

    QFile file(dataFile);
    file.open(QIODevice::Text | QIODevice::ReadOnly);
    QTextStream stream(&file);

    int counter = 0;
    clock_t tStart = clock();
    while (!stream.atEnd()) {
        counter++;
        QString str = stream.readLine();
        QStringList list = str.split(';');
        QString id = list[0];
        QString streetName = list[1];
        QString HouseName = list[2];
        QString HouseNumber = list[3];
        QString city = list[4];
        QString postalCode = list[5];

        QString temp_sql = "UPDATE temp_table_copy SET street_name='!1', house_number='!2',postal_code='!3',address_city='!4', house='!5' where id=" + id + ";";
        temp_sql = temp_sql.replace("!1", streetName);
        temp_sql = temp_sql.replace("!2", HouseNumber);
        temp_sql = temp_sql.replace("!3", postalCode);
        temp_sql = temp_sql.replace("!4", city);
        temp_sql = temp_sql.replace("!5", HouseName);

        sql += temp_sql;
        if (sql.size() >= 100000) {
            if (!q.exec(sql)) {
                 qDebug() << "Excute Error: " << q.lastError().text();
            }
            sql = "";
            printf("Finished: %d sql statment\n", counter);
        }

        if (counter == Number)
            break;
    }
    if (!sql.isEmpty()) {
        if (!q.exec(sql)) {
            qDebug() << "Excute Error: " << q.lastError().text();
        }
        printf("Finished: %d sql statment\n", counter);
    }
    db.commit(); // commit and


    printf("Time taken: %.2fs\n", (double)(clock() - tStart)/CLOCKS_PER_SEC);
    db.close();

. Я добавляю большую строку SQL с помощью оператора SQL, и когда она достигает размера 100 000, я выполняю ее и очищаю строку, чтобы избежать неправильного размещения, когда строка слишком большого размера в памяти, а также я читаю это MySQL база данных имеет определенный размер для выполняемой инструкции SQL, и я получаю ее предел с помощью

SHOW VARIABLES LIKE 'max_allowed_packet';

проблема здесь в том, что не все данные обновляются, некоторые идентификаторы имеют значение в текстовом файле и не обновляется внутри таблицы базы данных MySQL, в чем может быть проблема? эти столбцы перед обновлением не имеют значения, поэтому, когда я пытаюсь подсчитать, сколько не было обновлений, я обнаружил только 7M, что означает, что некоторые идентификаторы не обновляются, а также я не получил никакой ошибки в запросе, никакой помощи или предложения, чтобы узнать, почему это произошло, или лучший способ сделать это.
Заранее спасибо.

...