Вставка связанных данных в таблицы происходит медленнее, чем ожидалось - PullRequest
0 голосов
/ 07 мая 2018

Я создал программу, которая записывает список семьи.

Записи записываются с учетной карточки.

В учетную карточку. Содержит Предка и его родственника.

У меня есть две таблицы

Таблица 1

Информация о предке, такая как имя, ID (автоинкремент), имя файла, имя пользователя (имя на ПК)

Таблица 2

Информация о родственниках, например, имя, ancestor_id (из таблицы 1)

Программой пользуются 20 человек. Поэтому мне нужно получить идентификатор, сгенерированный при вставке предка, перед вставкой родственников.

иногда в указателе есть 10 родственников. а иногда бывает 20

это моя хранимая процедура

INSERT INTO tbl_ancestor(an,`as`, dd, cn, su, mm, stn, re, yy, st,  filename, username, `zipName`, `batchName`, `folderName`, `remark`) 
        VALUES(_an, _as, _dd, _cn, _su, _mm, _stn, _re, _yy, _st, _fname, _username, _zipName, _batchName, _folderName, _remark);
        SELECT ID, filename, username, zipName, batchName, foldername FROM tbl_ancestor;

Но когда запись в базе данных становится 10000, она ждет в течение 5 секунд сообщения, чтобы сообщить, что данные были сохранены.

Я использую только оператор выбора. Потому что я думал, что это поможет мне решить проблему, если я использую linq в своем коде c #, чтобы получить идентификатор этого предка, который будет использоваться моими родственниками. Но скорость такая же.

Это ошибка в моем запросе?

или в моих кодах c #?

foreach (var item in tag.RelativeList)
{
    using (MySqlCommand cmd = new MySqlCommand("sp_insert_relative", conn)
    {
        CommandType = System.Data.CommandType.StoredProcedure
    })
    {
        if (conn.State == System.Data.ConnectionState.Closed)
            conn.Open();

        cmd.Parameters.AddWithValue("_ancestor_id", id);
        cmd.Parameters.AddWithValue("_rgn", item.RGN);
        cmd.Parameters.AddWithValue("_rsn", item.RSN);
        cmd.Parameters.AddWithValue("_sgn", item.SGN);
        cmd.Parameters.AddWithValue("_ssn", item.SN);
        cmd.Parameters.AddWithValue("_username", tag.Username);
        cmd.Parameters.AddWithValue("_fname", System.IO.Path.GetFileName(tag.FileName));
        cmd.ExecuteNonQuery();
    }
}

Есть ли способ решить это? Чтобы сделать мою программу быстрее? Я не могу придумать способ решить это. Я тоже искал. Но я не могу найти конкретное решение. Или, может быть, я использую неправильное ключевое слово для поиска?

1 Ответ

0 голосов
/ 07 мая 2018
          using (MySqlTransaction trans = conn.BeginTransaction())
          {
              foreach (var item in tag.RelativeList)
              {
        using (MySqlCommand cmd = new MySqlCommand("sp_insert_relative",conn)
        {
            CommandType = System.Data.CommandType.StoredProcedure
        })
        {
            if (conn.State == System.Data.ConnectionState.Closed)
                conn.Open();

            cmd.Parameters.AddWithValue("_ancestor_id", id);
            cmd.Parameters.AddWithValue("_rgn", item.RGN);
            cmd.Parameters.AddWithValue("_rsn", item.RSN);
            cmd.Parameters.AddWithValue("_sgn", item.SGN);
            cmd.Parameters.AddWithValue("_ssn", item.SN);
            cmd.Parameters.AddWithValue("_username", tag.Username);
            cmd.Parameters.AddWithValue("_fname", System.IO.Path.GetFileName(tag.FileName));
            cmd.ExecuteNonQuery();
        }
trans.commit
    }
}

Вы можете использовать MysqlTransaction Для ускорения вставки или обновления данных в вашей базе данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...