Посетитель
Покинул форум
Сообщений всего: 319
Дата рег-ции: Окт. 2011
Помог: 3 раз(а)
|
Мелкий пишет:nordghost пишет:Первый запрос - 3 строки
До агрегации?
Сколько после остаётся не очень интересно. Всё равно полезет сортировать временную табличку
Индекс по device_FK, node_FK и captured_datetime по node_data добавьте и ещё раз explain второго запроса. Лучше нормальным текстом, а не наскальной живописью.
Первый запрос. Хм, 3 строки после агрегации. Хм.
Индекс по device_node_mapping device_id & node_id и с учётом индекса по node_data для второго запроса должно зашевелиться довольно внятно вот так:
CODE ( SQL):
скопировать код в буфер обмена
SELECT `node`.`id`, `node`.`node_id`, `device_node_mapping`.`id` AS `nodeNameId`, `node`.`node_type`, last_captured_node.captured_datetime, `device_node_mapping`.`node_name` AS `nodeName` FROM ( SELECT node_FK, max(node_data.captured_datetime) AS captured_datetime FROM `node_data` WHERE `device_FK`=199 GROUP BY node_FK ) last_captured_node JOIN `node` ON last_captured_node.node_FK = node.id JOIN `device_node_mapping` ON device_node_mapping.node_id = node.node_id AND device_node_mapping.device_id=6145686 ORDER BY `captured_datetime`
Интересно, mysql сумеет сделать loose index only scan такого подзапроса?
После всех оптимизаций данный запрос занимает 0.5 секунды, это прогресс по сравнению с 3.2 изначально!!! Спасибо
(Добавление)
LIME пишет:nordghost срочно нужен explain на второй запрос после индекса captured_datetime
(Добавление)
(Добавление)
он вербознее
Вот експлкйн
CODE ( javascript):
скопировать код в буфер обмена
{ "query_block": { "select_id": 1, "cost_info": { "query_cost": "3410169.83" }, "ordering_operation": { "using_temporary_table": true, "using_filesort": true, "cost_info": { "sort_cost": "1548168.53" }, "nested_loop": [ { "table": { "table_name": "device_node_mapping", "access_type": "ALL", "rows_examined_per_scan": 524, "rows_produced_per_join": 52, "filtered": "10.00", "cost_info": { "read_cost": "100.37", "eval_cost": "10.48", "prefix_cost": "110.85", "data_read_per_join": "7K" }, "used_columns": [ "id", "device_id", "node_id", "node_name" ], "attached_condition": "(`clouddashboard`.`device_node_mapping`.`device_id` = 6145686)" } }, { "table": { "table_name": "node", "access_type": "ALL", "possible_keys": [ "PRIMARY" ], "rows_examined_per_scan": 390, "rows_produced_per_join": 2043, "filtered": "10.00", "using_join_buffer": "Block Nested Loop", "cost_info": { "read_cost": "1.03", "eval_cost": "408.72", "prefix_cost": "4199.07", "data_read_per_join": "239K" }, "used_columns": [ "id", "node_id", "node_type" ], "attached_condition": "(`clouddashboard`.`device_node_mapping`.`node_id` = `clouddashboard`.`node`.`node_id`)" } }, { "table": { "table_name": "last_captured_node", "access_type": "ref", "possible_keys": [ "<auto_key0>" ], "key": "<auto_key0>", "used_key_parts": [ "node_FK" ], "key_length": "4", "ref": [ "clouddashboard.node.id" ], "rows_examined_per_scan": 757, "rows_produced_per_join": 1548168, "filtered": "100.00", "cost_info": { "read_cost": "1548168.53", "eval_cost": "309633.71", "prefix_cost": "1862001.30", "data_read_per_join": "23M" }, "used_columns": [ "node_FK", "captured_datetime" ], "materialized_from_subquery": { "using_temporary_table": true, "dependent": false, "cacheable": true, "query_block": { "select_id": 2, "cost_info": { "query_cost": "76295.40" }, "grouping_operation": { "using_temporary_table": true, "using_filesort": true, "table": { "table_name": "node_data", "access_type": "ref", "possible_keys": [ "device_FK", "node_FK" ], "key": "device_FK", "used_key_parts": [ "device_FK" ], "key_length": "4", "ref": [ "const" ], "rows_examined_per_scan": 295452, "rows_produced_per_join": 295452, "filtered": "100.00", "index_condition": "(`clouddashboard`.`node_data`.`device_FK` <=> 199)", "cost_info": { "read_cost": "17205.00", "eval_cost": "59090.40", "prefix_cost": "76295.40", "data_read_per_join": "6M" }, "used_columns": [ "id", "device_FK", "node_FK", "captured_datetime" ] } } } } } } ] } } }
(Добавление)
Дело ещё в том что node_data имеет очень много колонок и JOIN с node_data - это перебор кучи данных? Возможно ли задать какой либо лимит для JOIN-а?
|