我正在检查 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 Output
我已经尝试了 OPTIMIZE TABLE,但仍然记录了非索引查询。
关于如何修复这个问题有什么建议吗?
谢谢。
最佳答案
我不喜欢 log_queries_not_using_indexes = 1
因为你发现的原因 -- 它使慢日志困惑,因为条目可能不值得注意。
设置的一个借口是当你开始一个项目时, table 还很小。您可能忘记向最终会增长的表添加合适的索引。为此,我会打开它一天,然后查看输出,添加缺失的索引,然后永远关闭它。
对于那个查询,我会
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 不好;你让事情变得更糟。
关于mysql - Magento:MySql 显示缺少索引的慢查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49171916/