Низкая производительность для извлечения миллионов строк из базы данных MySQL и записи в csv

РЕДАКТИРОВАТЬ: перебор Reader занимает время, Execute Reader возвращается через несколько секунд. Есть ли более быстрый способ вместо итерации?

Я пытаюсь получить данные из MySQL на основе фильтров. Ранее я использовал EF, это было очень медленно, поэтому я решил переключиться на Чтение данных, используя MySQLDataReader, он прекрасно работает, когда результат содержит мало записей, но ужасно медленный при большом результате, скажем, Миллион строк. Я использую следующую функцию, чтобы сформулировать запрос.

public string GetCorrespondingQuery()
    {
        string zips = "\"" + string.Join("\",\"", _zips) + "\"";
        string counties = "\"" + string.Join("\",\"", _counties) + "\"";
        string states = "\"" + string.Join("\",\"", _states) + "\"";
        string cities = "\"" + string.Join("\",\"", _cities) + "\"";

        if ((_zips.Count == 0) && (_states.Count == 0) && (_counties.Count == 0) && (_cities.Count == 0))
            throw new Exception("Alert! No Filters Selected.");
        string query = "select * from dbcustomer JOIN dbzipcode On dbcustomer.ZIPCODE = dbzipcode.ZIP";
        if (_zips.Count > 0)
            query += " where dbzipcode.Zip in (" + zips + ")";
        if (_states.Count > 0)
            query += " and dbzipcode.STATE in (" + states + ")";
        if (_cities.Count > 0)
            query += " and dbzipcode.City in (" + cities + ")";
        if (_counties.Count > 0)
            query += " and dbzipcode.County in (" + counties + ")";

        return query + ";";
    }

Вышеупомянутый запрос занимает несколько секунд при выполнении в MySQL Workbench, но занимает несколько минут с использованием C#.

Ниже приведен код для извлечения данных из базы данных MySQL.

public List<CustomerDTO> FetchCustomersUsingQuery(CustomersFilter filter)
    {
        string query = filter.GetCorrespondingQuery();
        List<CustomerDTO> customers = new List<CustomerDTO>();
        using (MySqlConnection con = new MySqlConnection(_connectionString))
        {
            MySqlCommand cmd = new MySqlCommand(query, con);
            cmd.CommandTimeout = 0;
            cmd.CommandType = CommandType.Text;

            con.Open();
            using (MySqlDataReader reader = cmd.ExecuteReader())
            {
                while (reader.Read())
                {
                    var customer = new CustomerDTO()
                    {
                        PHONE = reader.GetString(0),
                        FIRSTNAME = reader.GetString(1),
                        LASTNAME = reader.GetString(2),
                        ADDRESS = reader.GetString(3),
                        CStatus = reader.GetString(4),
                        Campaign = reader.GetString(5),
                        ListName = reader.GetString(6),
                        Email = reader.GetString(7),
                        Recording = reader.GetBoolean(8),
                        ZIP = reader.GetString(9),
                        CITY = reader.GetString(11),
                        COUNTY = reader.GetString(12),
                        STATE = reader.GetString(13),
                    };
                    customers.Add(customer);
                }
                reader.Close();
            }
            con.Close();
        }
        //s.Stop();
        //throw new Exception("Time to Fetch " + customers.Count + " records = " + s.Elapsed);

        return customers;
    }

Я попробовал все, что мог, Кто-нибудь может направить меня, чтобы ускорить это? Я изо всех сил пытаюсь улучшить это за последние несколько недель

0 ответов

Другие вопросы по тегам