mysql - Magento:MySql 显示缺少索引的慢查询

标签 mysql performance magento entity-attribute-value

我正在检查 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_idstore_id 可以交换,但我怀疑这是否重要。

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

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

关于mysql - Magento:MySql 显示缺少索引的慢查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49171916/

相关文章:

c# - 使用 C# 从 Magento 导入销售订单(salesOrderList 函数): "There is an error in XML document (2, 372)"

php - 如何从数据库中显示两次行信息

mysql - 来自不同表的 SQL 时间间隔

php - php 和 mysql 的性能

magento - 含运费的免费产品不显示付款方式

php - Magento产品页面上的ERR_TOO_MANY_REDIRECTS

php - 排名/天梯系统

php - 简介 LVL 编程器 : Verify & Execute Guidance in PHP/MySQL

performance - 对 HTTP/2 与以前的协议(protocol)版本进行基准测试

node.js - BrowserSync 非常慢