SQL import statements ...
SET unique_checks=1;
я прямо дропал все индексы и констрейнты, потом грузил заведомо корректные данные, после создавал ключи, получал существенный прирост Вот примерный код: SET @@cte_max_recursion_depth = 999999 ; SET @materials_count = 200000 , @documents_count = 100000 , @positions_per_document = 150 ; SET FOREIGN_KEY_CHECKS = 0, SQL_LOG_BIN = 0, UNIQUE_CHECKS = 0 ; ... ALTER TABLE document_positions DROP CONSTRAINT document_positions_document_id , DROP CONSTRAINT document_positions_material_id , DROP KEY document_id , DROP KEY material_id ; INSERT document_positions (document_id, material_id, cnt) WITH RECURSIVE p(n) AS ( SELECT 1 n UNION ALL SELECT n + 1 n FROM p WHERE n + 1 <= @positions_per_document ) , d AS ( SELECT DISTINCT d.id document_id , FLOOR(1 + (RAND() * (@materials_count))) material_id FROM p CROSS JOIN documents d ) SELECT document_id, material_id , FLOOR(1 + (RAND() * 1000)) cnt FROM d ; ALTER TABLE document_positions ADD UNIQUE KEY (document_id, material_id) ; ALTER TABLE document_positions ADD KEY (material_id) ; ALTER TABLE document_positions ADD CONSTRAINT document_positions_document_id FOREIGN KEY (document_id) REFERENCES documents (id) ; ALTER TABLE document_positions ADD CONSTRAINT document_positions_material_id FOREIGN KEY (material_id) REFERENCES materials (id) ; SET FOREIGN_KEY_CHECKS = 1, SQL_LOG_BIN = 1, UNIQUE_CHECKS = 1 ;Констрейнты вообще в таком режиме создаются мгновенно, без проверки
Я понял, спасибо большое. Буду это пробовать. Но по прежнему вопрос по настройкам самого сервера остается. Почему при утилизации на диске 83.70% у процессора 18.89% iowait?
io - не только диск. это и память, плюс это мгновенное значение, все нормально
А как-то понять в чем именно бутылочное горлышко нельзя? Это может навести на те параметры которые стоит еще подкрутить на серверной части.
бутылочное горлышко - cpu
Вы меня совсем запутали. Как CPU (одно его ядро) может быть бутылочным горлышком, если он простаивает и ничего не делает даже тем одним ядром.
задача выполняется в 1 поток. 1 поток может сожрать максимум 1 ядро cpu
да да, это я понимаю, но даже одно ядро не загруженно.
Обсуждают сегодня