Delphi. FireDac. Как быстро создать 1 000 000 записей в БД MySQL и отобразить их в DBGrid?

Этот пост об удобной возможности FireDAC писать в базу сразу очень много записей. В документации указано, что эта техника позволит сократить количество соединений между базой и нашим приложением. Для начала в БД MySQL создадим таблицу с одним автоинкрементным полем-счетчиком и 5 одинаковыми полями. Для этого я воспользовался услугами программы Workbench. Ниже я привожу код создания БД, его можно просто скопировать и вставить в консоль MySQL.

Создание БД и таблицы

Итак, наша БД называется array_db, а таблица в ней называется firsttable.


 

Создание клиента Delphi

Создадим новый VCL проект и добавим следующие компоненты

5

Для FDConnection1 создадим отдельное определение Connection Definition под именем MySQL_array_db и подключим его, настроим следующим образом. Это можно сделать разными способами, я делал через View | DataExplorer | FireDac | MySQL Server –> правой кнопкой мыши Add Connection и далее настроил параметры

4

В FDQuery1 в свойстве SQL  я написал запрос select*from firsttable


 

Генерация 1000 000 записей

Итак, сейчас мы перейдем непосредственно к генерации 1000 000 записей. Саму генерацию записей я предлагаю убрать в отдельный поток, поскольку миллион записей не появятся в базе одномоментно, а главное приложение может понадобиться.

Создание потока…

Далее ставим курсор на procedure Execute; и жмем Ctrl+Shift+C и получаем генерацию шаблона процедуры, в которую добавляем следующий код

Таймер

Таймер нужен для того, чтобы оценить время операции, поскольку мы будем работать с большими массивами – ограничимся секундами

Кнопка generateArray

Кнопка clearArray

Результат

6

 

Улучшаем результат

Результат для 1000 000 добавленных записей не плохой, но и его можно улучшить, поиграв с параметром Resource Options.ArrayDMLSize, который по умолчанию равен 2147483647 или 2 GB, но максимальное ограничение параметра max_allowed_packet по базе MySQL составляет 1GB, поэтому мы можем экспериментировать со снижением этого параметра. Выставим его, например в значение 10485760 или 10 Мб и посмотрим как это повлияет на время. 

7

 

Поставим значение Resource Options.ArrayDMLSize в 104857600 или 100 Мб и получим результат

8

Настраивая различные параметры со стороны сервера БД и клиента можно уменьшить время ожидания операций. Но это процесс экспериментов.

Выводы

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

Чем мне нравится FireDac, что при открытии множества, в DBGrid он загружает не весь 1000 000 записей, а FDQuery.FetchOptions.RowsetSize, по умолчанию там 50 записей. Это сильно увеличивает скорость отображения и экономит оперативную память.

Исходники

Скачать исходники (210_FireDac_1)

This entry was posted in Delphi, FireDAC, MySQL, Без рубрики. Bookmark the permalink.