Mysql 我有一个地狱般的SQL查询I';我想优化一下。让';让我们谈谈吧
所以,这里有一个问题可能会让SQL专家们跳到我身上说我懒惰,但我被难倒了。我们的在线商店今早崩溃并烧毁,这是可疑的查询。我整天都在考虑这个问题,还没有想出任何天才的优化方法。我能得到一些帮助吗?有什么重要的指标吗?如何重组?我意识到这就像问墙的另一边是什么,然后给你一个指向另一个方向的望远镜,但我觉得值得一试:Mysql 我有一个地狱般的SQL查询I';我想优化一下。让';让我们谈谈吧,mysql,sql,database,indexing,Mysql,Sql,Database,Indexing,所以,这里有一个问题可能会让SQL专家们跳到我身上说我懒惰,但我被难倒了。我们的在线商店今早崩溃并烧毁,这是可疑的查询。我整天都在考虑这个问题,还没有想出任何天才的优化方法。我能得到一些帮助吗?有什么重要的指标吗?如何重组?我意识到这就像问墙的另一边是什么,然后给你一个指向另一个方向的望远镜,但我觉得值得一试: SELECT DISTINCT (SELECT filename FROM (SELECT DISTINCT y.value AS label, x.value AS filename
SELECT DISTINCT (SELECT filename FROM (SELECT DISTINCT y.value AS label, x.value AS filename
FROM `catalog_product_super_link` AS z
INNER JOIN `catalog_product_entity_varchar` AS y
ON z.product_id = y.entity_id
INNER JOIN `catalog_product_entity_varchar` AS x
ON z.product_id = x.entity_id
WHERE parent_id = (SELECT entity_id
FROM `catalog_product_entity`
WHERE sku LIKE 'F11-ARC-7710%'
LIMIT 0, 1)
AND y.attribute_id = (SELECT attribute_id
FROM `eav_attribute`
WHERE attribute_code = 'image_label'
AND entity_type_id = (SELECT entity_type_id FROM `eav_entity_type` WHERE entity_type_code = 'catalog_product') LIMIT 0, 1)
AND x.attribute_id = (SELECT attribute_id
FROM `eav_attribute`
WHERE attribute_code = 'image'
AND entity_type_id = (SELECT entity_type_id FROM `eav_entity_type` WHERE entity_type_code = 'catalog_product'))) AS images WHERE c.value LIKE CONCAT(label,'%') LIMIT 0, 1) AS image,
pricing_value,
is_percent,
value_index,
c.value AS label,
d.sort_order AS sort_order
FROM `catalog_product_super_attribute_pricing` AS a
INNER JOIN `catalog_product_super_attribute_label` AS b
ON a.product_super_attribute_id = b.product_super_attribute_id
INNER JOIN `eav_attribute_option_value` AS c
ON value_index = c.option_id
INNER JOIN `eav_attribute_option` AS d
ON c.option_id = d.option_id
WHERE a.product_super_attribute_id = (SELECT product_super_attribute_id
FROM `catalog_product_super_attribute`
WHERE product_id = 5928
AND attribute_id = 143 LIMIT 0, 1)
UNION ALL
SELECT DISTINCT (SELECT filename FROM (SELECT DISTINCT y.value AS label, x.value AS filename
FROM `catalog_product_super_link` AS z
INNER JOIN `catalog_product_entity_varchar` AS y
ON z.product_id = y.entity_id
INNER JOIN `catalog_product_entity_varchar` AS x
ON z.product_id = x.entity_id
WHERE parent_id = (SELECT entity_id
FROM `catalog_product_entity`
WHERE sku LIKE 'F11-ARC-7710%'
LIMIT 0, 1)
AND y.attribute_id = (SELECT attribute_id
FROM `eav_attribute`
WHERE attribute_code = 'image_label'
AND entity_type_id = (SELECT entity_type_id FROM `eav_entity_type` WHERE entity_type_code = 'catalog_product') LIMIT 0, 1)
AND x.attribute_id = (SELECT attribute_id
FROM `eav_attribute`
WHERE attribute_code = 'image'
AND entity_type_id = (SELECT entity_type_id FROM `eav_entity_type` WHERE entity_type_code = 'catalog_product'))) AS images
WHERE label LIKE CONCAT((SELECT value FROM `eav_attribute_option_value` WHERE option_id = c.value LIMIT 0, 1),'%') LIMIT 0, 1) AS image,
0 AS pricing_value,
0 AS is_percent,
c.value AS value_index,
(SELECT value FROM `eav_attribute_option_value` WHERE option_id = c.value LIMIT 0, 1) AS label,
(SELECT sort_order FROM `eav_attribute_option` WHERE option_id = c.value LIMIT 0, 1) AS sort_order
FROM `catalog_product_entity` AS a
INNER JOIN `cataloginventory_stock_status` AS b
ON a.entity_id = b.product_id
INNER JOIN `catalog_product_entity_int` AS c
ON a.entity_id = c.entity_id
INNER JOIN `cataloginventory_stock_item` AS d
ON a.entity_id = d.product_id
WHERE c.attribute_id = (SELECT attribute_id
FROM `eav_attribute`
WHERE attribute_code = 'choose_size'
AND entity_type_id = (SELECT entity_type_id FROM `eav_entity_type` WHERE entity_type_code = 'catalog_product') LIMIT 0, 1)
AND a.entity_id IN (SELECT DISTINCT product_id
FROM `catalog_product_super_link`
WHERE parent_id = (SELECT entity_id FROM `catalog_product_entity` WHERE sku LIKE 'F11-ARC-7710%' LIMIT 0, 1))
AND (b.qty > 0 OR d.manage_stock = 0)
AND (SELECT value
FROM `eav_attribute_option_value`
WHERE option_id = c.value
LIMIT 0, 1) NOT IN (SELECT c.value
FROM `catalog_product_super_attribute_pricing` AS a
INNER JOIN `catalog_product_super_attribute_label` AS b ON a.product_super_attribute_id = b.product_super_attribute_id
INNER JOIN `eav_attribute_option_value` AS c ON value_index = c.option_id
WHERE a.product_super_attribute_id = (SELECT product_super_attribute_id FROM `catalog_product_super_attribute`
WHERE product_id = 5928
AND attribute_id = 143))
ORDER BY sort_order
提前谢谢 噢,天啊
除了WHERE子句中的每一列上的索引之外,我没有什么可以提供的,我还解释了查看是否有表扫描的计划
我的经验法则是,七个或更多的连接将表现不佳。我计算的内部连接子句比你的多。我对这个问题会有严重的保留。有可能去规范化吗?风景怎么样?这对你有帮助吗?你比我更了解你的模式和问题。快速回答
你能用PLSQL的等效语言来做吗?
你能消除这些子查询吗
首先执行这些操作并存储结果。
假设它们返回一行
然后,编写一个较小的查询,传入变量。前几天我回答的这个问题可能会对您有所帮助:
它是关于使嵌套查询更高效。我怀疑,如果您单独处理嵌套选择,然后使用结果形成一个更简单的查询,这会有所帮助。允许的巡演查询要复杂得多,所以可能会有更多,但希望这只是一个开始。如果没有更多的信息,甚至没有您的测试台,这几乎是不可能的 但除了按照其他人的建议运行解释计划和添加索引之外,我还看到一些可能可以从中提取出来以改进的东西: 例如,您重复了子选择:例如:
(SELECT entity_id
FROM `catalog_product_entity`
WHERE sku LIKE 'F11-ARC-7710%'
LIMIT 0, 1)
考虑将它们拉到FROM子句的最高级别,然后加入以获得结果。一次不多。如果对3或4个变体执行此操作,您应该会看到改进
另一件看起来不太正确的事情是,在子选择中嵌套的非常深。。。您可能不需要这些,它们可能会增加开销。此查询太长、太复杂,无法花时间理解,因此可以对其进行优化。您能给出输入数据、表结构和所需输出的(小!)示例吗?PLSQL是Oracle特有的。标签上写着MySQL。但是存储过程是个好主意,这不是个坏主意。所有这些子查询都是使这个特定查询在各种开发/登台/实时环境中始终工作所必需的(我们在Magento上,任何在Magento上的人都会理解——IDs的变化)。但是分解它们只会将其转换为7个查询而不是一个…在这种情况下,我相信7个查询将比一个嵌套查询更快。还应该能够检测您所在的环境并有条件地构建正确的查询。通过拆分查询并缓存子查询的结果来解决,这样子查询只执行一次。