【发布时间】:2018-03-08 11:23:00
【问题描述】:
我正在检查 Magento 1.8.1 的性能问题,我在 my.ini 中启用了以下 MySql 参数:
log_queries_not_using_indexes = 1
log_slow_admin_statements = 1
slow_query_log = 1
long_query_time = 1
我没有任何慢查询(执行时间大于 1 秒),但我有很多查询记录为缺少索引的连接查询。例如,其中之一是:
SELECT `t_d`.`entity_id`, `t_d`.`attribute_id`, `t_d`.`value` AS `default_value`, `t_s`.`value` AS `store_value`, IF(t_s.value_id IS NULL, t_d.value, t_s.value) AS `value`
FROM `catalog_product_entity_text` AS `t_d`
LEFT JOIN `catalog_product_entity_text` AS `t_s` ON t_s.attribute_id = t_d.attribute_id AND t_s.entity_id = t_d.entity_id AND t_s.store_id = 1 WHERE (t_d.entity_type_id = 4) AND (t_d.entity_id IN (459, 444, 455, 450, 449, 458, 454, 443, 453)) AND (t_d.attribute_id IN ('73')) AND (t_d.store_id = 0)
UNION ALL SELECT `t_d`.`entity_id`, `t_d`.`attribute_id`, `t_d`.`value` AS `default_value`, `t_s`.`value` AS `store_value`, IF(t_s.value_id IS NULL, t_d.value, t_s.value) AS `value`
FROM `catalog_product_entity_decimal` AS `t_d`
LEFT JOIN `catalog_product_entity_decimal` AS `t_s` ON t_s.attribute_id = t_d.attribute_id AND t_s.entity_id = t_d.entity_id AND t_s.store_id = 1 WHERE (t_d.entity_type_id = 4) AND (t_d.entity_id IN (459, 444, 455, 450, 449, 458, 454, 443, 453)) AND (t_d.attribute_id IN ('76', '80', '120')) AND (t_d.store_id = 0)
UNION ALL SELECT `t_d`.`entity_id`, `t_d`.`attribute_id`, `t_d`.`value` AS `default_value`, `t_s`.`value` AS `store_value`, IF(t_s.value_id IS NULL, t_d.value, t_s.value) AS `value`
FROM `catalog_product_entity_datetime` AS `t_d`
LEFT JOIN `catalog_product_entity_datetime` AS `t_s` ON t_s.attribute_id = t_d.attribute_id AND t_s.entity_id = t_d.entity_id AND t_s.store_id = 1 WHERE (t_d.entity_type_id = 4) AND (t_d.entity_id IN (459, 444, 455, 450, 449, 458, 454, 443, 453)) AND (t_d.attribute_id IN ('77', '78', '93', '94')) AND (t_d.store_id = 0)
UNION ALL SELECT `t_d`.`entity_id`, `t_d`.`attribute_id`, `t_d`.`value` AS `default_value`, `t_s`.`value` AS `store_value`, IF(t_s.value_id IS NULL, t_d.value, t_s.value) AS `value`
FROM `catalog_product_entity_varchar` AS `t_d`
LEFT JOIN `catalog_product_entity_varchar` AS `t_s` ON t_s.attribute_id = t_d.attribute_id AND t_s.entity_id = t_d.entity_id AND t_s.store_id = 1 WHERE (t_d.entity_type_id = 4) AND (t_d.entity_id IN (459, 444, 455, 450, 449, 458, 454, 443, 453)) AND (t_d.attribute_id IN ('86', '87', '97', '112', '113', '114', '118', '119', '176')) AND (t_d.store_id = 0)
UNION ALL SELECT `t_d`.`entity_id`, `t_d`.`attribute_id`, `t_d`.`value` AS `default_value`, `t_s`.`value` AS `store_value`, IF(t_s.value_id IS NULL, t_d.value, t_s.value) AS `value`
FROM `catalog_product_entity_int` AS `t_d`
LEFT JOIN `catalog_product_entity_int` AS `t_s` ON t_s.attribute_id = t_d.attribute_id AND t_s.entity_id = t_d.entity_id AND t_s.store_id = 1 WHERE (t_d.entity_type_id = 4) AND (t_d.entity_id IN (459, 444, 455, 450, 449, 458, 454, 443, 453)) AND (t_d.attribute_id IN ('96', '121', '123', '125', '126', '127', '128', '131', '192', '193')) AND (t_d.store_id = 0);
如果我检查表,索引就在那里......所以不清楚为什么 MySql 将查询记录为未索引,同样在 Phpmyadmin 中我注意到有太多查询不使用索引。
这是 DESCRIBE 输出: Describe Output
我已经尝试过 OPTIMIZE TABLE,但仍然记录了非索引查询。
关于如何修复问题的任何建议?
谢谢。
【问题讨论】:
-
它认为缺少哪个索引? DESCRIBE 的实际结果是什么?
-
您好,我已经编辑帖子添加了 DESCRIBE 输出图像,您可以看到 phpmyadmin 生成的解释计划。
-
@FilippoScifo 如果您设置 'long_query_time' = 5000 秒,您将专注于 log_queries_not_using_indexes 而不是与一秒限制相关的所有混乱。
标签: mysql performance magento entity-attribute-value