Форум программистов, компьютерный форум, киберфорум
C#: Базы данных
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.53/15: Рейтинг темы: голосов - 15, средняя оценка - 4.53
0 / 0 / 0
Регистрация: 25.05.2018
Сообщений: 10
MySQL

Скорость вывода результата select *

06.09.2021, 10:46. Показов 3079. Ответов 5
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день.
Есть в таблица на удаленном сервере mysql в около 50 000 записей и С# приложение

Проблема 1
Запрос на вывод всей таблицы производится за ~10сек (в воркбенче проверялось)

Проблема 2
Уже полученные строки долго выгружаются в LisrView и блокируют гуи

2ая проблема отчасти решена выгрузкой массива айтемов с помощью addrange, а гуи так и блокируется

Вопросы:
1. Как узнать и протестировать, почему такая низкая скорость обработки запроса?
Есть ли какие-то способы ускорить запрос? Индексы, я так понимаю мне не помогут, т.к. запрос select * from table, но есть один индекс - primary. Использование представления тоже не помогло.
2. Если проблема в слабом железе, можно ли как-то компенсировать это в приложении, чтобы пользователь не бесился? Например, постепенной выгрузкой записей см. 4 пункт
3. VirtualMode у ListView поможет только от лагов в гуи? На скорость выгрузки это никак не влияет?
4. Использовать подкачку строк из бд в listview хорошая идея? Есть ли примеры?
5. Насколько способ использовать локальную бд для текущего сеанса, а бд на сервере просто для хранения, адекватный?
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
06.09.2021, 10:46
Ответы с готовыми решениями:

Вывод результата запроса select sql в textbox
Всем здравствуйте! Понадобилось вывести в текстбокс результат запроса соединение через sqldatasourse declare @data varchar(max), ...

Вывод результата выборки Select SQL в Excel
Доброго времени суток! Подскажите, варианты решений в такой ситуации: Есть программа которая отображает результаты по определенному...

Ошибка вывода результата группировки
Написал запрос к базе данных с группировкой по двум полям. Затем пытаюсь вывести результат но выдает ошибку.Что сделал не так? namespace...

5
 Аватар для Andrey-MSK
3349 / 2235 / 388
Регистрация: 14.08.2018
Сообщений: 7,557
Записей в блоге: 4
06.09.2021, 11:10
dashahaha05,
1. Не знаю как в MySQL, но в MS SQL Server есть генерация планов запроса, в которых видно что и как происходит.

По поводу лагов и блокировки UI, используйте для загрузки, да и вообще для работы с БД, методы async/await.

Добавлено через 3 минуты
dashahaha05, асинхронный пример для MS SQL Server
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
public static async Task<List<LaborHBWork>> GetWorksByTypeIDAsync(int typeID)
{
    List<LaborHBWork> laborHBWorks = new List<LaborHBWork>();
    string sqlText =
        "SELECT ID_LaborHB_02, ID_LaborHB_01, PosNum, NameOfWork, WorkCode, Labor, LaborAssembly, ErectCoeff " +
        "FROM dbo.tblLaborHB_02 " +
        "WHERE ID_LaborHB_01 = @id";
 
    using (SqlConnection connection = new SqlConnection(_connectionString))
    {
        try
        {
            await connection.OpenAsync();
 
            SqlCommand sqlCommand = new SqlCommand(sqlText, connection)
            {
                CommandType = CommandType.Text
            };
            SqlParameter pID = new SqlParameter
            {
                ParameterName = "@id",
                Value = typeID,
                SqlDbType = SqlDbType.Int,
                Direction = ParameterDirection.Input
            };
            sqlCommand.Parameters.Add(pID);
 
            using (SqlDataReader dataReader = await sqlCommand.ExecuteReaderAsync())
            {
                while (await dataReader.ReadAsync())
                {
                    laborHBWorks.Add(new LaborHBWork
                    {
                        IDLaborHBWork = (int)dataReader["ID_LaborHB_02"],
                        IDLaborHBType = (int)dataReader["ID_LaborHB_01"],
                        PosNum = (int)dataReader["PosNum"],
                        NameOfWork = dataReader["NameOfWork"] as string ?? "",
                        WorkCode = dataReader["WorkCode"] as string ?? "",
                        Labor = (decimal)dataReader["Labor"],
                        LaborAssembly = dataReader["LaborAssembly"]
                            == DBNull.Value ? null : (decimal?)dataReader["LaborAssembly"],
                        ErectCoeff = (decimal)dataReader["ErectCoeff"]
                    });
                }
            }
 
            return laborHBWorks;
        }
        catch (Exception ex)
        {
            throw new ApplicationException("Ошибка выборки данных", ex);
        }
    }
}
1
 Аватар для Cupko
658 / 595 / 171
Регистрация: 17.07.2012
Сообщений: 1,682
Записей в блоге: 1
06.09.2021, 12:11
dashahaha05, тут единственно верный вопрос: Зачем пользователю эти 50 тысяч строк?
Я уже тысячу лет с ВинФормами не работал, но по-моему виртуальный режим и должен за подгрузку строк отвечать, нет?
Я помню точно, что у DevExpress и Telerik компонентов это всё реализовано из коробки, но они платные.
Наверняка есть бесплатные аналоги.
Если нет, пишите сами ручками логику подгрузки/фильтрации/сортировки
0
1497 / 1238 / 245
Регистрация: 04.04.2011
Сообщений: 4,363
06.09.2021, 12:23
Лучший ответ Сообщение было отмечено dashahaha05 как решение

Решение

dashahaha05,
1. План запроса, как уже было сказано. Но это вряд ли поможет, если у Вас простая выборка из одной таблицы (select * from table), а полей у таблицы 100500 и они в большинстве строковые.
Таблетка: пересмотреть смысл такой таблицы - возможно, она просто содержит избыточную информацию, и перепроектировать с оптимизацией (возможно, разбить данные по нескольким таблицам).

2. Зачем пользователь список из 50000 записей ? Как он будет с ним работать ?
Таблетка: выборка записей по условиям, которые пользователь может менять как ему нужно (по временным периодам, например) либо сделать пагинацию с вменяемым количеством строк на листе (50-100).

3. Сам по себе VirtualMode никак не "разгонит" скорость выборки и передачи данных от сервера приложению. А вот запуск запроса во вторичном потоке (опять-таки как уже было сказано) избавит приложения от "зависона". И опять же актуален вопрос 2.

4. LazyLoad может помочь, но опять-таки вопрос 2

5. Зависит от логики Вашего приложения. Если в нем предусмотрено внесение изменений в БД, то путь очень сомнительный, т.к. придется писать не примитивную логику для переноса изменений из локальной базы в "общую".

Резюме: не следует тащить из базы такое количество данных за раз - их "КПД" будет крайне низок.
0
HF
 Аватар для HF
1316 / 895 / 200
Регистрация: 09.09.2011
Сообщений: 2,688
Записей в блоге: 2
06.09.2021, 12:27
Цитата Сообщение от dashahaha05 Посмотреть сообщение
2. Если проблема в слабом железе, можно ли как-то компенсировать это в приложении, чтобы пользователь не бесился?
Чтобы пользователь не бесился - нужно узнать у него точные требования к работе приложения/этой странице.
Все здесь просто уверены что ему НЕ НУЖНЫ 50000 записей одновременно.
Но ему наверняка нужно что-то другое. Если он в итоге будет искать нужную запись - то Делаем поиск и догрузку. Если он будет ваш ListView "тыкать", то тоже быстрая догрузка нод поможет.
1
1497 / 1238 / 245
Регистрация: 04.04.2011
Сообщений: 4,363
06.09.2021, 12:34
Есть простой и надежный, а, главное, удобный для пользователя, интерфейс для работы с обширными базами данных.
Это "сопутствующий" основному массиву данных (грид, листвью и т.д.) элемент TreeView, который содержит иерархический список узлов-заголовков. Отображение частей основной информации (как правило, не больших) выполняется по клику на узле заголовке.
Например, есть БД каких-то документов за период 10 лет. "Дерево" содержит годы, в них месяцы, в них декады и т.д. Данные отображаются либо по году (долго), либо по месяцу (уже быстрее), либо по декаде (быстро), либо по дате (летает).
Плюс есть дополнительная возможность выборки документов по определенным условиям, задаваемым пользователям (фильтры).
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
06.09.2021, 12:34
Помогаю со студенческими работами здесь

Класс для записи в БД и вывода результата
Пишу класс для записи в БД и вывода результата в DataGridView Запись происходит идеально а с Fill я запутался((( подскажите плз? ...

Проблема деления и вывода результата в консоль
Доброго времени суток я работаю на С# недавно и возникла такая ситуация при делении меньшего числа на меньшие в консоль выводит ноль int...

DataGridView и скорость вывода
Каким образом можно увеличить вывод информации в датагрид? 1500 строк с 4 столбцами занимает 2.0-1.5 секунды времени зависона в...

Передача результата select в другой select
Доброго времени суток, как мне передать id из результата 1 селекта во 2 селект? SELECT id, parent, fio, level from tree AS first WHERE...

Обработка результата select'a
Есть select: DM.SQLCom.CommandText:='SELECT Расписание., Расписание., Расписание. FROM Расписание'+ ' WHERE ид_день =' +...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru