iamserge
@iamserge

Жуткие тормоза от mysql коннектора .net в с# — почему?

Работает все через .NET коннектор т.е. using MySql.Data.MySqlClient; и далее:
string Connect = "Database=dp_001;Data Source=localhost;User Id=root;Password=1234567890Aa";
                MySqlConnection myConnection = new MySqlConnection(Connect);
                myConnection.Open();

                int LIMITSTART = 0;
                int QUERYSIZE = 5000;

              while(LIMITSTART  < 50000000){
                    MySqlCommand myCommand = new MySqlCommand(String.Format("SELECT * FROM ep53 ORDER BY TimeValue LIMIT {0},{1}", LIMITSTART, QUERYSIZE), myConnection);
                    MySqlDataReader Reader= myCommand.ExecuteReader();

                    while (Reader.Read())
                    {
                          // Вытворяю всякое с новым кусочком данных ...
                    }
                   LIMITSTART = LIMITSTART  + 5000;
                   Reader.Close();

              }


Одна проблема - скорость после 5 запроса проседает просто жутко. То есть если сначала это доли секунды, то после это 12-15 секунд на один запрос, что наглядно видно в Workbench т.е. запрос выполняет на первой черепаховой скорости =(

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

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

Но как все таки справится с этими тормозами?

ps. Опыты показали, что если запросов очень много - такой эффект появляется примерно каждые 5-6 запросов, хотя периодически mysql видимо сам чистит какие то кэши и на время начинает работать быстрее ... Однако быстро проскочив их он тут же выдает такой вот жуткий и медленный запрос на 10-15 секунд ... Как-то все таки ведь можно его "почистить" судя по всему вручную, если он сам это умеет делать ...
  • Вопрос задан
  • 121 просмотр
Пригласить эксперта
Ответы на вопрос 1
xez
@xez
TL Junior Roo
Тормоза не от коннектора, а от сомнительного sql запроса:
SELECT * FROM ep53 ORDER BY TimeValue LIMIT {0},{1}

Офсет работает таким образом: выбирается весь диапазон данных, ограниченный лимитом, а затем первые n строк просто отбрасывается. Т.о. с каждым запросом вы выбираете все больше данных: в первой итерации 5000 строк, во второй 10000 и т.д. (int QUERYSIZE = 5000).
Вот статья по этому поводу https://use-the-index-luke.com/no-offset, там же рецепты с решениями.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы