Я работаю над улучшением производительности одного из запросов моей базы данных (MySQL). Все дело в том, что я сделал, у меня все еще низкая производительность. Перед моими изменениями Query запускается в 9.54, и после изменения некоторых индексов производительность повышается до 5.67s.медленный запрос с индексированными таблицами Mysql
Это мой запрос:
Query_time: 5,343565 Lock_time: 0,000302 Rows_sent: 100005 Rows_examined: 200017
Код:
SET timestamp=1455032448;
SELECT
id,
description,
unit_price,
(SELECT coalesce(sum(quantity),0) from si_invoice_items where product_id = si_products.id) as qty_out ,
(SELECT coalesce(sum(quantity),0) from si_inventory where product_id = si_products.id) as qty_in ,
(SELECT coalesce(reorder_level,0)) as reorder_level ,
(SELECT qty_in - qty_out) as quantity,
(SELECT (CASE WHEN enabled = 0 THEN 'Disabled' ELSE 'Enabled' END)) AS enabled
FROM
si_products
WHERE
visible = 1
AND domain_id = '1'
ORDER BY
description asc;
Это информация индекс всех таблиц :
Table Non_unique Key_name Seq_in_index Column_name Collation Cardinality Sub_part Packed Null Index_type
si_products 0 PRIMARY 1 id A 100005 NULL NULL BTREE
si_products 0 PRIMARY 2 domain_id A 100005 NULL NULL BTREE
si_products 1 unit_price 1 unit_price A 10000 NULL NULL YESBTREE
si_products 1 description 1 id A 100005 NULL NULL BTREE
si_products 1 description 2 description A 100005 15 NULL BTREE
Table Non_unique Key_name Seq_in_index Column_name Collation Cardinality Sub_part Packed Null Index_type Comment Index_comment
si_inventory 0 PRIMARY 1 domain_id A NULL NULL NULL BTREE
si_inventory 0 PRIMARY 2 id A 0 NULL NULL BTREE
si_inventory 1 product_id 1 product_id A NULL NULL NULL BTREE
si_inventory 1 quantity 1 quantity A NULL NULL NULL BTREE
Table Non_unique Key_name Seq_in_index Column_name Collation Cardinality Sub_part Packed Null Index_type Comment Index_comment
si_invoice_items 0 PRIMARY 1 id A NULL NULL NULL BTREE
si_invoice_items 0 PRIMARY 2 invoice_id A 7 NULL NULL BTREE
si_invoice_items 1 unit_price 1 unit_price A NULL NULL NULL YES BTREE
si_invoice_items 1 quantity 1 quantity A NULL NULL NULL BTREE
si_invoice_items 1 product_id 1 product_id A NULL NULL NULL YES
Любое предложение будет оценено.
С моего последнего изменения улучшить немного
Query_time: 3,723339 Lock_time: 0,000254 Rows_sent: 100005 Rows_examined: 200024 rows_affected: 0
SET timestamp=1455037952;
SELECT
A.id,
A.description,
A.unit_price,
(SELECT coalesce(sum(B.quantity),0) from si_invoice_items B JOIN si_products A ON B.product_id = A.id) as qty_out ,
(SELECT coalesce(sum(C.quantity),0) from si_inventory C JOIN si_products A ON C.product_id = A.id) as qty_in ,
(SELECT coalesce(A.reorder_level,0)) as reorder_level ,
(SELECT qty_in - qty_out) as quantity,
(CASE WHEN A.enabled = 0 THEN 'Disabled' ELSE 'Enabled' END) AS enabled
FROM
si_products A
WHERE
A.visible = 1
AND A.domain_id = '1'
ORDER BY
description asc;
Благодаря Олли, я уже пытался проверить запрос с вашим предложением, но, по-видимому, не улучшил время отклика.
Это результат вашего подхода:
# Query_time: 4.041339 Lock_time: 0.000245 Rows_sent: 100005 Rows_examined: 200029
# Rows_affected: 0
SET timestamp=1455045101;
SELECT p.id, p.description, p.unit_price,
COALESCE(invoice.quantity,0) as qty_out,
COALESCE(inventory.quantity,0)as qty_in,
coalesce(p.reorder_level,0) as reorder_level ,
(select qty_in - qty_out) as quantity
FROM si_products p
LEFT JOIN (
SELECT SUM(quantity) quantity, product_id
FROM si_invoice_items
GROUP BY product_id
) invoice ON p.id = invoice.product_id
LEFT JOIN (
SELECT SUM(quantity) quantity, product_id
FROM si_inventory
GROUP BY product_id
) inventory ON p.id = inventory.product_id
WHERE p.visible = 1
AND p.domain_id = '1'
ORDER BY
description asc;
Вы выполняете коррелированные подзапросы. вы ничего не можете сделать, чтобы улучшить ситуацию, поскольку каждый из этих запросов выполняется для каждой найденной строки родительской таблицы. например вы не используете один запрос, вы используете n * 5 запросов, где 'n' - количество записей в родительском запросе. –
Точно я согласен с тобой. Последнее, что я сделал, это заменить предложение where с помощью JOIN и улучшить его до 3.6. –
Если бы это был я, я бы уложил этот запрос и начал с некоторых операторов CREATE и INSERT и желаемого результата. – Strawberry