【问题标题】:Magento: MySql show slow query with missing indexMagento:MySql 显示缺少索引的慢查询
【发布时间】: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


【解决方案1】:

我不喜欢 log_queries_not_using_indexes = 1 的原因是你发现的——它使慢日志变得混乱,因为这些条目可能不值得一提。

设置的一个借口是当您开始一个项目时,表格仍然很小。您可能忘记为最终会增长的表添加合适的索引。为此,我会打开它一天,然后查看输出,添加缺失的索引,然后永远关闭它。

对于那个查询,我会

 t_d:  INDEX(entity_type_id, store_id, attribute_id, entity_id)
 t_s:  INDEX(entity_type_id, store_id)

entity_type_id 和 store_id 可以互换,但我怀疑这是否重要。

OPTIMIZE TABLE 不太可能影响索引的使用。如果表是 InnoDB(它们应该是),您可能永远不会从 OPTIMIZE TABLE 中受益。

哦,糟糕! 4 个表,包含 4 种不同的数据类型。随着数据的增长,您将遇到麻烦。 EAV 不好;你让事情变得更糟了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-04-06
    • 2019-09-24
    • 1970-01-01
    • 2011-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-10
    相关资源
    最近更新 更多