Magento 查询速度慢
Magento Query slow
我有生成 sku 编号的代码,它使用此查询查找现有 sku table 中的空白。
SELECT t1.sku
FROM catalog_product_entity t1
LEFT JOIN catalog_product_entity AS t2 ON CAST( t2.sku AS UNSIGNED ) = CAST( t1.sku AS UNSIGNED ) +1
WHERE t2.sku IS NULL
AND CAST( t1.sku AS UNSIGNED ) >100000
ORDER BY CAST( t1.sku AS UNSIGNED ) ASC
LIMIT 1
如果没有 Ordery By,则需要不到一秒钟的时间。通过订购大约需要一分钟。有没有办法优化查询以加快加载速度?
Table 构建:
CREATE TABLE `catalog_product_entity` ( `entity_id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT 'Entity ID',
`entity_type_id` smallint(5) unsigned NOT NULL DEFAULT '0' COMMENT 'Entity Type ID',
`attribute_set_id` smallint(5) unsigned NOT NULL DEFAULT '0' COMMENT 'Attribute Set ID',
`type_id` varchar(32) NOT NULL DEFAULT 'simple' COMMENT 'Type ID',
`sku` varchar(64) DEFAULT NULL COMMENT 'SKU',
`created_at` timestamp NULL DEFAULT NULL COMMENT 'Creation Time', `updated_at` timestamp NULL DEFAULT NULL COMMENT 'Update Time', `has_options` smallint(6) NOT NULL DEFAULT '0' COMMENT 'Has Options', `required_options` smallint(5) unsigned NOT NULL DEFAULT '0' COMMENT 'Required Options', `absolute_price` tinyint(1) NOT NULL DEFAULT '0', `absolute_weight` tinyint(1) NOT NULL DEFAULT '0', PRIMARY KEY (`entity_id`), KEY `IDX_CATALOG_PRODUCT_ENTITY_ENTITY_TYPE_ID` (`entity_type_id`), KEY `IDX_CATALOG_PRODUCT_ENTITY_ATTRIBUTE_SET_ID` (`attribute_set_id`), KEY `IDX_CATALOG_PRODUCT_ENTITY_SKU` (`sku`), CONSTRAINT `FK_CAT_PRD_ENTT_ATTR_SET_ID_EAV_ATTR_SET_ATTR_SET_ID` FOREIGN KEY (`attribute_set_id`) REFERENCES `eav_attribute_set` (`attribute_set_id`) ON DELETE CASCADE ON UPDATE CASCADE, CONSTRAINT `FK_CAT_PRD_ENTT_ENTT_TYPE_ID_EAV_ENTT_TYPE_ENTT_TYPE_ID` FOREIGN KEY (`entity_type_id`) REFERENCES `eav_entity_type` (`entity_type_id`) ON DELETE CASCADE ON UPDATE CASCADE) ENGINE=InnoDB AUTO_INCREMENT=14950 DEFAULT CHARSET=utf8 COMMENT='Catalog Product Table'
CAST 是杀手。
如果您想对数字进行算术运算并使用索引,请将值存储为数字。
ON function(indexed_column) ...
不能在该列上使用索引。 WHERE 子句中的同上。
ORDER BY 必须找到所有可能的行并在交付一行之前对它们进行排序 (LIMIT 1)。 JOIN 必须在第二个 table 中完全扫描第一个 table 中的每一行,所以这花了很长时间。
如果没有 ORDER BY,在满足 LIMIT 1 之前只需要一次这样的扫描。因此它看起来很快。 (但速度不如 sku
声明为 INT 或 BIGINT 并且您删除了 CAST。)
我有生成 sku 编号的代码,它使用此查询查找现有 sku table 中的空白。
SELECT t1.sku
FROM catalog_product_entity t1
LEFT JOIN catalog_product_entity AS t2 ON CAST( t2.sku AS UNSIGNED ) = CAST( t1.sku AS UNSIGNED ) +1
WHERE t2.sku IS NULL
AND CAST( t1.sku AS UNSIGNED ) >100000
ORDER BY CAST( t1.sku AS UNSIGNED ) ASC
LIMIT 1
如果没有 Ordery By,则需要不到一秒钟的时间。通过订购大约需要一分钟。有没有办法优化查询以加快加载速度?
Table 构建:
CREATE TABLE `catalog_product_entity` ( `entity_id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT 'Entity ID',
`entity_type_id` smallint(5) unsigned NOT NULL DEFAULT '0' COMMENT 'Entity Type ID',
`attribute_set_id` smallint(5) unsigned NOT NULL DEFAULT '0' COMMENT 'Attribute Set ID',
`type_id` varchar(32) NOT NULL DEFAULT 'simple' COMMENT 'Type ID',
`sku` varchar(64) DEFAULT NULL COMMENT 'SKU',
`created_at` timestamp NULL DEFAULT NULL COMMENT 'Creation Time', `updated_at` timestamp NULL DEFAULT NULL COMMENT 'Update Time', `has_options` smallint(6) NOT NULL DEFAULT '0' COMMENT 'Has Options', `required_options` smallint(5) unsigned NOT NULL DEFAULT '0' COMMENT 'Required Options', `absolute_price` tinyint(1) NOT NULL DEFAULT '0', `absolute_weight` tinyint(1) NOT NULL DEFAULT '0', PRIMARY KEY (`entity_id`), KEY `IDX_CATALOG_PRODUCT_ENTITY_ENTITY_TYPE_ID` (`entity_type_id`), KEY `IDX_CATALOG_PRODUCT_ENTITY_ATTRIBUTE_SET_ID` (`attribute_set_id`), KEY `IDX_CATALOG_PRODUCT_ENTITY_SKU` (`sku`), CONSTRAINT `FK_CAT_PRD_ENTT_ATTR_SET_ID_EAV_ATTR_SET_ATTR_SET_ID` FOREIGN KEY (`attribute_set_id`) REFERENCES `eav_attribute_set` (`attribute_set_id`) ON DELETE CASCADE ON UPDATE CASCADE, CONSTRAINT `FK_CAT_PRD_ENTT_ENTT_TYPE_ID_EAV_ENTT_TYPE_ENTT_TYPE_ID` FOREIGN KEY (`entity_type_id`) REFERENCES `eav_entity_type` (`entity_type_id`) ON DELETE CASCADE ON UPDATE CASCADE) ENGINE=InnoDB AUTO_INCREMENT=14950 DEFAULT CHARSET=utf8 COMMENT='Catalog Product Table'
CAST 是杀手。
如果您想对数字进行算术运算并使用索引,请将值存储为数字。
ON function(indexed_column) ...
不能在该列上使用索引。 WHERE 子句中的同上。
ORDER BY 必须找到所有可能的行并在交付一行之前对它们进行排序 (LIMIT 1)。 JOIN 必须在第二个 table 中完全扫描第一个 table 中的每一行,所以这花了很长时间。
如果没有 ORDER BY,在满足 LIMIT 1 之前只需要一次这样的扫描。因此它看起来很快。 (但速度不如 sku
声明为 INT 或 BIGINT 并且您删除了 CAST。)