由于连接超级慢的mysql查询

时间:2017-09-12 13:42:16

标签: mysql performance join

我一直在尝试优化此查询,并且无法让它在15分钟内完成! 在左侧和内侧连接处玩游戏时,我看不到任何真正的性能优势。我试图将一些连接切换到子查询,也没有。检查了一些索引并根据查询中的外观顺序对它们重新排序。纳达。我可以让这个查询运行20秒,但目前它运行了几分钟。解释显示546的最大结果,所以我不确定为什么要花那么长时间。最大的表是distro_company_locations,有92,000条记录。

任何帮助将不胜感激。 运行MySQL 5.6。

有关简化查询的信息,请参见下文

说明:

"id"    "select_type"   "table" "type"  "possible_keys" "key"   "key_len"   "ref"   "rows"  "filtered"  "Extra"
"1" "PRIMARY"   "distro_company_product"    "index" "PRIMARY,distro_company_product_idx1"   "distro_company_product_idx1"   "439"       "546"   "75.09" "Using where; Using index; Using temporary; Using filesort"
"1" "PRIMARY"   "distro_company_product_country"    "ref"   "PRIMARY"   "PRIMARY"   "4" "forex.distro_company_product.id"   "1" "100"   "Using index"
"1" "PRIMARY"   "<derived2>"    "ref"   "<auto_key1>"   "<auto_key1>"   "4" "forex.distro_company_product.id"   "15"    "100"   
"1" "PRIMARY"   "distro_company_payers_priority"    "ref"   "distro_company_payers_priority_idx1"   "distro_company_payers_priority_idx1"   "6" "distro_company_product_payers.payer_id,const"  "2" "100"   "Using where; Using index"
"1" "PRIMARY"   "distro_company_product_exchangerates"  "ref"   "distro_company_product_exchangerates_idx1" "distro_company_product_exchangerates_idx1" "4" "forex.distro_company_product.id"   "1" "100"   "Using index"
"1" "PRIMARY"   "distro_company_product_location"   "ref"   "PRIMARY"   "PRIMARY"   "4" "forex.distro_company_product.id"   "17"    "100"   "Using index"
"1" "PRIMARY"   "a" "ref"   "PRIMARY"   "PRIMARY"   "8" "forex.distro_company_product_location.location_id" "1" "100"   "Using index"
"1" "PRIMARY"   "b" "ALL"                   "1" "100"   "Using where"
"1" "PRIMARY"   "distro_company_payers_link"    "eq_ref"    "PRIMARY,distro_company_payers_link_idx1"   "PRIMARY"   "8" "func,const"    "1" "100"   "Using where"
"1" "PRIMARY"   "distro_company_locations"  "ref"   "PRIMARY,location_data,distro_company_locations_idx1"   "PRIMARY"   "8" "forex.distro_company_product_location.location_id" "1" "100"   "Using where"
"1" "PRIMARY"   "distro_company_location_payer" "eq_ref"    "PRIMARY,distro_company_location_payer_idx1"    "PRIMARY"   "12"    "forex.distro_company_locations.id,distro_company_product_payers.payer_id"  "1" "100"   "Using index"
"1" "PRIMARY"   "currencies"    "ref"   "PRIMARY,currencies_idx1"   "PRIMARY"   "2" "forex.distro_company_product_exchangerates.currency_id"    "1" "100"   
"1" "PRIMARY"   "dc"    "ref_or_null"   "distro_company_disabled_currency_idx1" "distro_company_disabled_currency_idx1" "8" "forex.distro_company_product_exchangerates.currency_id,const"  "2" "100"   "Using where; Not exists; Using index"
"1" "PRIMARY"   "distro_company_location_currency"  "eq_ref"    "PRIMARY,distro_company_location_currency_idx1" "PRIMARY"   "10"    "forex.distro_company_product_location.location_id,forex.distro_company_product_exchangerates.currency_id"  "1" "100"   
"1" "PRIMARY"   "distro_company_automatic_promo"    "index" "distro_company_automatic_promo_idx1"   "distro_company_automatic_promo_idx1"   "18"        "2" "100"   "Using where; Using index; Using join buffer (Block Nested Loop)"
"1" "PRIMARY"   "promos"    "eq_ref"    "PRIMARY,promos_idx1"   "PRIMARY"   "4" "forex.distro_company_automatic_promo.promo_id" "1" "100"   "Using where"
"1" "PRIMARY"   "product_id_limits" "ref_or_null"   "distro_company_id_limits_idx1" "distro_company_id_limits_idx1" "3" "const" "2" "100"   "Using where; Using index"
"1" "PRIMARY"   "payer_id_limits"   "ref"   "distro_company_id_limits_idx2" "distro_company_id_limits_idx2" "5" "distro_company_product_payers.payer_id"    "1" "100"   "Using index"
"1" "PRIMARY"   "distro_company_disabled_product"   "eq_ref"    "PRIMARY"   "PRIMARY"   "4" "forex.distro_company_product.id"   "1" "100"   "Using where; Not exists; Using index"
"2" "DERIVED"   "<derived4>"    "ALL"                   "289"   "100"   "Using where; Using temporary; Using filesort"
"2" "DERIVED"   "b" "ref"   "PRIMARY,distro_company_location_payer_idx1"    "distro_company_location_payer_idx1"    "4" "c.id"  "16"    "100"   "Using where; Using index"
"2" "DERIVED"   "a" "ref"   "distro_company_product_location_idx1"  "distro_company_product_location_idx1"  "8" "forex.b.location_id"   "1" "100"   "Using where; Using index"
"4" "DERIVED"   "a" "ALL"                   "289"   "100"   "Using temporary; Using filesort"
"4" "DERIVED"   "b" "ALL"                   "1" "100"   "Using where; Using join buffer (Block Nested Loop)"
"4" "DERIVED"   "c" "eq_ref"    "PRIMARY"   "PRIMARY"   "4" "forex.b.payer_id"  "1" "100"   
"3" "DEPENDENT SUBQUERY"    "d" "ALL"                   "1" "100"   "Using where"
"3" "DEPENDENT SUBQUERY"    "e" "ref"   "PRIMARY"   "PRIMARY"   "4" "forex.a.product_id"    "1" "100"   "Using where; Using index"

以下是架构:

CREATE TABLE `distro_company_product` (
  `id` INTEGER(11) NOT NULL AUTO_INCREMENT,
  `company_id` SMALLINT(6) UNSIGNED NOT NULL,
  `delivery_type` TINYINT(4) UNSIGNED DEFAULT NULL COMMENT '1 - bank deposit\r\n2 - cash pickup\r\n3 - mobile\r\n4 - home delivery\r\n5 - bill pay\r\n6 - top up',
  `fee_ach` DOUBLE(15,3) DEFAULT NULL,
  `fee_cc` DOUBLE(15,3) DEFAULT NULL,
  `fee_debit` DOUBLE(15,3) DEFAULT NULL,
  `max_limit` DOUBLE(15,3) UNSIGNED DEFAULT NULL,
  `min_limit` DOUBLE(15,3) UNSIGNED DEFAULT NULL,
  `fee_misc` DOUBLE(15,3) DEFAULT NULL,
  `number_of_locations` MEDIUMINT(9) UNSIGNED DEFAULT 0,
  `special_fields` INTEGER(10) UNSIGNED NOT NULL,
  `partner_id` VARCHAR(20) COLLATE utf8_general_ci DEFAULT NULL,
  `availability` VARCHAR(100) COLLATE utf8_general_ci DEFAULT NULL,
  `require_location` ENUM('NOT_REQUIRED','REQUIRED_LOCATION','REQUIRED_LOCATION_FOR_PRICE','REQUIRED_PAYER','REQUIRED_PAYER_FOR_PRICE') COLLATE utf8_general_ci NOT NULL DEFAULT 'NOT_REQUIRED' COMMENT '0 - does not require location\r\n1 - requires location\r\n2 - requires location to show price\r\n3 - requires payer\r\n4 - requires payer to show price',
  `priority` TINYINT(3) UNSIGNED DEFAULT 0,
  PRIMARY KEY USING BTREE (`id`, `company_id`),
  KEY `distro_company_product_idx1` USING BTREE (`id`, `company_id`, `delivery_type`, `fee_ach`, `fee_cc`, `fee_debit`, `max_limit`, `min_limit`, `priority`, `fee_misc`, `number_of_locations`, `special_fields`, `availability`, `require_location`, `partner_id`)
) ENGINE=InnoDB
AUTO_INCREMENT=3813 CHARACTER SET 'utf8' COLLATE 'utf8_general_ci'
;

CREATE TABLE `distro_company_product_country` (
  `country_id` SMALLINT(6) UNSIGNED NOT NULL,
  `product_id` INTEGER(11) NOT NULL,
  PRIMARY KEY USING BTREE (`product_id`, `country_id`)
) ENGINE=InnoDB
CHARACTER SET 'utf8' COLLATE 'utf8_general_ci'
;

CREATE TABLE `distro_company_payers_priority` (
  `payer_id` INTEGER(11) NOT NULL,
  `country_id` SMALLINT(5) UNSIGNED NOT NULL,
  `currency_id` SMALLINT(5) UNSIGNED DEFAULT NULL,
  `company_id` SMALLINT(5) UNSIGNED NOT NULL,
  `priority` SMALLINT(6) NOT NULL,
  `product_id` INTEGER(11) NOT NULL,
  KEY `distro_company_payers_priority_idx1` USING BTREE (`payer_id`, `company_id`, `product_id`, `country_id`, `currency_id`, `priority`)
) ENGINE=InnoDB
CHARACTER SET 'utf8' COLLATE 'utf8_general_ci'
;

CREATE TABLE `distro_company_product_exchangerates` (
  `product_id` INTEGER(11) NOT NULL,
  `exchange_rate` DOUBLE(15,7) UNSIGNED DEFAULT NULL,
  `currency_id` SMALLINT(6) UNSIGNED NOT NULL,
  `last_update` TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  `max_amount` FLOAT(9,3) UNSIGNED DEFAULT NULL,
  `min_amount` FLOAT(9,3) UNSIGNED DEFAULT NULL,
  `rule_id` INTEGER(11) UNSIGNED NOT NULL,
  PRIMARY KEY USING BTREE (`currency_id`, `product_id`, `rule_id`),
  UNIQUE KEY `distro_company_product_exchangerates_idx1` USING BTREE (`product_id`, `rule_id`, `currency_id`, `last_update`, `exchange_rate`)
) ENGINE=InnoDB
CHARACTER SET 'utf8' COLLATE 'utf8_general_ci'
;

CREATE TABLE `distro_company_product_location` (
  `product_id` INTEGER(11) NOT NULL,
  `location_id` BIGINT(20) NOT NULL,
  PRIMARY KEY USING BTREE (`product_id`, `location_id`),
  UNIQUE KEY `distro_company_product_location_idx1` USING BTREE (`location_id`, `product_id`)
) ENGINE=InnoDB
CHARACTER SET 'utf8' COLLATE 'utf8_general_ci'
;

CREATE TABLE `distro_company_payers_link` (
  `payer_id` INTEGER(10) UNSIGNED NOT NULL,
  `company_id` INTEGER(10) UNSIGNED NOT NULL,
  `require_location` TINYINT(1) UNSIGNED NOT NULL DEFAULT 0,
  `fee_rule_id` INTEGER(11) DEFAULT NULL,
  `exchange_rate_rule_id` INTEGER(11) DEFAULT NULL,
  PRIMARY KEY USING BTREE (`payer_id`, `company_id`),
  KEY `distro_company_payers_link_idx1` USING BTREE (`payer_id`, `company_id`, `require_location`)
) ENGINE=InnoDB
CHARACTER SET 'utf8' COLLATE 'utf8_general_ci'
;

CREATE TABLE `distro_company_locations` (
  `id` BIGINT(20) NOT NULL AUTO_INCREMENT,
  `country_id` SMALLINT(6) UNSIGNED NOT NULL,
  `state` VARCHAR(25) COLLATE utf8_general_ci DEFAULT NULL,
  `city` VARCHAR(50) COLLATE utf8_general_ci DEFAULT NULL,
  `address1` VARCHAR(200) COLLATE utf8_general_ci DEFAULT NULL,
  `address2` VARCHAR(200) COLLATE utf8_general_ci NOT NULL,
  `geocoordinates` POINT DEFAULT NULL,
  `location_name` VARCHAR(100) COLLATE utf8_general_ci DEFAULT NULL,
  `locationLimit` DOUBLE(15,3) NOT NULL DEFAULT 0.000 COMMENT 'Maximum location payment amount in USD',
  `special_fields` INTEGER(10) UNSIGNED NOT NULL,
  `hours_of_ops` VARCHAR(100) COLLATE utf8_general_ci DEFAULT NULL,
  `phone` VARCHAR(20) COLLATE utf8_general_ci DEFAULT NULL,
  PRIMARY KEY USING BTREE (`id`, `country_id`),
  UNIQUE KEY `location_data` USING BTREE (`id`, `country_id`, `state`, `city`, `address1`, `address2`, `geocoordinates`, `location_name`, `phone`),
  KEY `distro_company_locations_idx1` USING BTREE (`id`, `special_fields`)
) ENGINE=InnoDB
AUTO_INCREMENT=100502 CHARACTER SET 'utf8' COLLATE 'utf8_general_ci'
;


CREATE TABLE `distro_company_location_payer` (
  `location_id` BIGINT(20) NOT NULL,
  `payer_id` INTEGER(11) NOT NULL,
  PRIMARY KEY USING BTREE (`location_id`, `payer_id`),
  UNIQUE KEY `distro_company_location_payer_idx1` USING BTREE (`payer_id`, `location_id`)
) ENGINE=InnoDB
CHARACTER SET 'utf8' COLLATE 'utf8_general_ci'
;

CREATE TABLE `currencies` (
  `id` SMALLINT(6) UNSIGNED NOT NULL AUTO_INCREMENT,
  `currency_name` VARCHAR(50) COLLATE latin1_swedish_ci NOT NULL,
  `symbol` CHAR(3) COLLATE latin1_swedish_ci NOT NULL,
  `iso` SMALLINT(6) UNSIGNED NOT NULL,
  PRIMARY KEY USING BTREE (`id`, `symbol`),
  UNIQUE KEY `symbol` USING BTREE (`symbol`),
  UNIQUE KEY `iso` USING BTREE (`iso`),
  KEY `currencies_idx1` USING BTREE (`id`, `symbol`, `currency_name`)
) ENGINE=InnoDB
AUTO_INCREMENT=175 CHARACTER SET 'latin1' COLLATE 'latin1_swedish_ci'
;

CREATE TABLE `distro_company_disabled_currency` (
  `currency_id` SMALLINT(5) UNSIGNED DEFAULT NULL,
  `company_id` INTEGER(11) DEFAULT NULL,
  `product_id` INTEGER(11) DEFAULT NULL,
  `rule_id` INTEGER(11) NOT NULL AUTO_INCREMENT,
  PRIMARY KEY USING BTREE (`rule_id`),
  KEY `distro_company_disabled_currency_idx1` USING BTREE (`currency_id`, `company_id`, `product_id`, `rule_id`)
) ENGINE=InnoDB
AUTO_INCREMENT=2 CHARACTER SET 'utf8' COLLATE 'utf8_general_ci'
;

CREATE TABLE `distro_company_location_currency` (
  `location_id` BIGINT(20) NOT NULL,
  `currency_id` SMALLINT(6) UNSIGNED NOT NULL,
  `exchange_rate` DOUBLE(15,7) UNSIGNED NOT NULL,
  `last_update` TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY USING BTREE (`location_id`, `currency_id`),
  KEY `distro_company_location_currency_idx1` USING BTREE (`location_id`, `currency_id`, `exchange_rate`, `last_update`)
) ENGINE=InnoDB
CHARACTER SET 'utf8' COLLATE 'utf8_general_ci'
;

CREATE TABLE `distro_company_automatic_promo` (
  `promo_id` INTEGER(10) UNSIGNED DEFAULT NULL,
  `product_id` INTEGER(11) DEFAULT NULL,
  `country_id` SMALLINT(5) UNSIGNED DEFAULT NULL,
  `company_id` INTEGER(11) DEFAULT NULL,
  KEY `distro_company_automatic_promo_idx1` USING BTREE (`product_id`, `country_id`, `company_id`, `promo_id`)
) ENGINE=InnoDB
CHARACTER SET 'utf8' COLLATE 'utf8_general_ci'
;


CREATE TABLE `promos` (
  `id` INTEGER(10) UNSIGNED NOT NULL AUTO_INCREMENT,
  `promo_code` VARCHAR(50) COLLATE latin1_swedish_ci NOT NULL,
  `amount` DECIMAL(10,2) NOT NULL DEFAULT 0.00,
  `start_promo` DATE NOT NULL,
  `end_promo` DATE NOT NULL,
  `percentage` TINYINT(1) NOT NULL DEFAULT 0,
  `usage_limit` TINYINT(4) UNSIGNED NOT NULL DEFAULT 0,
  `sticky_promo_mins` INTEGER(11) UNSIGNED DEFAULT NULL ,
  `first_time_only` TINYINT(1) DEFAULT 0 ,
  `max_usage_limit` SMALLINT(6) DEFAULT NULL ,
  `min_send_amount` FLOAT DEFAULT 0 ,
  `max_send_amount` FLOAT DEFAULT 0 ,
  `is_bonus_promo` TINYINT(1) DEFAULT 0 ,
  PRIMARY KEY USING BTREE (`id`),
  KEY `promos_idx1` USING BTREE (`id`, `start_promo`, `end_promo`, `promo_code`)
) ENGINE=InnoDB
AUTO_INCREMENT=43 CHARACTER SET 'latin1' COLLATE 'latin1_swedish_ci'
;

CREATE TABLE `distro_company_id_limits` (
  `company_id` SMALLINT(5) UNSIGNED DEFAULT NULL,
  `product_id` INTEGER(11) DEFAULT NULL,
  `payer_id` INTEGER(11) DEFAULT NULL,
  `id_limit` FLOAT UNSIGNED,
  KEY `distro_company_id_limits_idx2` USING BTREE (`payer_id`, `id_limit`),
  KEY `distro_company_id_limits_idx1` USING BTREE (`company_id`, `product_id`, `id_limit`)
) ENGINE=InnoDB
CHARACTER SET 'utf8' COLLATE 'utf8_general_ci'
;

CREATE TABLE `distro_company_disabled_product` (
  `product_id` INTEGER(11) NOT NULL,
  PRIMARY KEY USING BTREE (`product_id`)
) ENGINE=InnoDB
CHARACTER SET 'utf8' COLLATE 'utf8_general_ci'
;

CREATE ALGORITHM=UNDEFINED DEFINER='system'@'%' SQL SECURITY DEFINER VIEW `distro_company_location_payer_merged`
AS
select
  `a`.`location_id` AS `location_id`,
  ifnull(`b`.`payer_id`, `a`.`payer_id`) AS `payer_id`
from
  (`distro_company_location_payer` `a`
  left join `distro_company_payer_merge` `b` on (((`b`.`payer_to_replace_id` = `a`.`payer_id`) and (`b`.`complete_merge` = 1))));


CREATE ALGORITHM=UNDEFINED DEFINER='system'@'%' SQL SECURITY DEFINER VIEW `distro_company_product_payers`
AS
select
  `a`.`product_id` AS `product_id`,
  `b`.`payer_id` AS `payer_id`,
  `c`.`logo` AS `logo`,
  `c`.`name` AS `name`,
  count(`a`.`location_id`) AS `number_of_locations`
from
  ((`distro_company_product_location` `a`
  join `distro_company_location_payer` `b`)
  join `distro_company_payers_merged` `c`)
where
  ((`b`.`location_id` = `a`.`location_id`) and
  (`c`.`id` = `b`.`payer_id`) and
  (not (`c`.`id` in (
                      select
                        `d`.`payer_id`
                      from
                        (`distro_company_disabled_payer` `d`
                        join `distro_company_product_country` `e`)
                      where
                        ((`e`.`product_id` = `a`.`product_id`) and
                        (isnull(`d`.`product_id`) or
                        (`a`.`product_id` = `d`.`product_id`)) and
                        (isnull(`d`.`country_id`) or
                        (`d`.`country_id` = `e`.`country_id`)))
  ))))
group by
  `a`.`product_id`,
  `b`.`payer_id`;


CREATE ALGORITHM=UNDEFINED DEFINER='system'@'%' SQL SECURITY DEFINER VIEW `distro_company_payers_merged`
AS
select
  if (`b`.`complete_merge`, `c`.`id`, `a`.`id`) AS `id`,
  if (isnull(`c`.`logo`), `a`.`logo`, `c`.`logo`) AS `logo`,
  if (isnull(`c`.`name`), `a`.`name`, `c`.`name`) AS `name`
from
  ((`distro_company_payers` `a`
  left join `distro_company_payer_merge` `b` on ((`b`.`payer_to_replace_id` = `a`.`id`)))
  left join `distro_company_payers` `c` on ((`c`.`id` = `b`.`payer_id`)))
group by
  `id`;

CREATE TABLE `distro_company_payer_merge` (
  `payer_to_replace_id` INTEGER(11) DEFAULT NULL,
  `payer_id` INTEGER(11) DEFAULT NULL,
  `complete_merge` TINYINT(1) DEFAULT 0 COMMENT 'If true, will also merge id\r\nIf false, only merge name/logo'
) ENGINE=InnoDB
AVG_ROW_LENGTH=8192 CHARACTER SET 'latin1' COLLATE 'latin1_swedish_ci'
;

更多信息 - 更新

尝试缩小问题范围。我已经简化了一下查询并摆脱了一些花里胡哨的东西。仍然需要超过5分钟的时间来执行(我终止后甚至不确定需要多长时间) 这是更新的查询:

SELECT `distro_company_product`.`id`,
         `delivery_type`,
         `fee_ach`,
         `fee_cc`,
         `fee_debit`,
         `max_limit`,
         `min_limit`,
         `distro_company_product`.`priority`,
         `fee_misc`,
         distro_company_product.`number_of_locations`,
         `distro_company_product`.`special_fields` AS `special_field_id`,
         distro_company_product_country.`country_id`,
         `availability`,
         distro_company_product.`require_location`    
  FROM `distro_company_product`
       INNER JOIN `distro_company_product_country` ON `distro_company_product_country`.product_id =
         `distro_company_product`.id
       INNER JOIN `distro_company_product_exchangerates` ON distro_company_product_exchangerates.product_id = `distro_company_product`.id 
INNER JOIN `currencies` ON `currencies`.id = `distro_company_product_exchangerates`.currency_id           
       INNER JOIN `distro_company_product_location` ON
        `distro_company_product_location`.product_id =
         `distro_company_product`.id     
       INNER JOIN `distro_company_location_currency` ON
        `distro_company_product_location`.`location_id` =
         `distro_company_location_currency`.`location_id` AND 
         `distro_company_location_currency`.currency_id = distro_company_product_exchangerates.currency_id       
       LEFT JOIN distro_company_product_payers ON distro_company_product_payers.product_id = `distro_company_product`.id 
       LEFT JOIN distro_company_payers_priority ON distro_company_payers_priority.payer_id = `distro_company_product_payers`.payer_id AND 
                (distro_company_payers_priority.company_id IS NULL OR distro_company_payers_priority.company_id = `distro_company_product`.company_id) AND 
                (distro_company_payers_priority.product_id IS NULL OR distro_company_payers_priority.product_id = `distro_company_product`.id) AND                 
                (distro_company_payers_priority.country_id IS NULL OR distro_company_payers_priority.country_id = `distro_company_product_country`.country_id)
    LEFT JOIN `distro_company_location_payer_merged` ON  distro_company_product_location.location_id = distro_company_location_payer_merged.location_id  
        LEFT JOIN distro_company_payers_link ON distro_company_payers_link.payer_id = `distro_company_location_payer_merged`.payer_id AND distro_company_payers_link.company_id = `distro_company_product`.company_id
       LEFT JOIN `distro_company_location_payer` ON `distro_company_location_payer`.location_id = `distro_company_product_location`.location_id AND 
                    `distro_company_location_payer`.payer_id = `distro_company_product_payers`.payer_id       
       LEFT JOIN `distro_company_disabled_currency` as dc ON dc.currency_id = distro_company_product_exchangerates.currency_id AND 
       (dc.company_id IS NULL OR dc.company_id = `distro_company_product`.company_id) AND 
       (dc.product_id IS NULL OR dc.product_id = `distro_company_product`.id)
       LEFT JOIN distro_company_automatic_promo ON 
        (distro_company_automatic_promo.product_id = distro_company_product.id OR 
         distro_company_automatic_promo.country_id = distro_company_product_country.country_id OR 
         distro_company_automatic_promo.company_id = `distro_company_product`.company_id)
       LEFT JOIN promos ON
        distro_company_automatic_promo.promo_id = promos.id  
       LEFT JOIN distro_company_id_limits as product_id_limits ON 
                (product_id_limits.company_id IS NULL OR product_id_limits.company_id = `distro_company_product`.company_id) AND 
                (product_id_limits.product_id IS NULL OR product_id_limits.product_id = `distro_company_product`.id) AND 
                (product_id_limits.company_id IS NOT NULL OR product_id_limits.product_id IS NOT NULL)
       LEFT JOIN  distro_company_id_limits as `payer_id_limits` ON 
                payer_id_limits.payer_id = `distro_company_product_payers`.payer_id
         LEFT JOIN distro_company_disabled_product ON distro_company_disabled_product.product_id = `distro_company_product`.id
  WHERE `distro_company_product`.company_id = 8 AND dc.rule_id IS NULL AND distro_company_disabled_product.product_id IS NULL

更新的EXPLAIN:

"id"    "select_type"   "table" "type"  "possible_keys" "key"   "key_len"   "ref"   "rows"  "filtered"  "Extra"
"1" "PRIMARY"   "distro_company_product"    "ref"   "PRIMARY,distro_company_product_idx1,company_id,id" "company_id"    "2" "const" "10"    "100"   
"1" "PRIMARY"   "distro_company_product_exchangerates"  "ref"   "PRIMARY,distro_company_product_exchangerates_idx1,product_id"  "distro_company_product_exchangerates_idx1" "4" "forex.distro_company_product.id"   "1" "100"   "Using index"
"1" "PRIMARY"   "currencies"    "ref"   "PRIMARY,currencies_idx1"   "PRIMARY"   "2" "forex.distro_company_product_exchangerates.currency_id"    "1" "100"   "Using index"
"1" "PRIMARY"   "distro_company_product_country"    "ref"   "PRIMARY,product_id"    "PRIMARY"   "4" "forex.distro_company_product.id"   "1" "100"   "Using index"
"1" "PRIMARY"   "distro_company_product_location"   "ref"   "PRIMARY,distro_company_product_location_idx1,product_id,location_id"   "PRIMARY"   "4" "forex.distro_company_product.id"   "71"    "100"   "Using index"
"1" "PRIMARY"   "distro_company_location_currency"  "eq_ref"    "PRIMARY,distro_company_location_currency_idx1,location_id" "PRIMARY"   "10"    "forex.distro_company_product_location.location_id,forex.distro_company_product_exchangerates.currency_id"  "1" "100"   "Using index"
"1" "PRIMARY"   "<derived2>"    "ref"   "<auto_key1>"   "<auto_key1>"   "4" "forex.distro_company_product.id"   "122"   "100"   
"1" "PRIMARY"   "distro_company_payers_priority"    "ref"   "distro_company_payers_priority_idx1,payer_id,product_id,company_id"    "payer_id"  "4" "distro_company_product_payers.payer_id"    "1" "100"   "Using where"
"1" "PRIMARY"   "a" "ref"   "PRIMARY,location_id"   "PRIMARY"   "8" "forex.distro_company_product_location.location_id" "1" "100"   "Using index"
"1" "PRIMARY"   "b" "ALL"   "payer_to_replace_id,payer_to_replace_id_2"             "1" "100"   "Using where"
"1" "PRIMARY"   "distro_company_payers_link"    "eq_ref"    "PRIMARY,distro_company_payers_link_idx1,payer_id"  "PRIMARY"   "8" "func,const"    "1" "100"   "Using where; Using index"
"1" "PRIMARY"   "distro_company_location_payer" "eq_ref"    "PRIMARY,distro_company_location_payer_idx1,location_id,payer_id"   "PRIMARY"   "12"    "forex.distro_company_product_location.location_id,distro_company_product_payers.payer_id"  "1" "100"   "Using index"
"1" "PRIMARY"   "dc"    "ref_or_null"   "distro_company_disabled_currency_idx1,product_id"  "distro_company_disabled_currency_idx1" "8" "forex.distro_company_product_exchangerates.currency_id,const"  "2" "100"   "Using where; Not exists; Using index"
"1" "PRIMARY"   "distro_company_automatic_promo"    "index" "distro_company_automatic_promo_idx1,product_id"    "distro_company_automatic_promo_idx1"   "18"        "3" "100"   "Using where; Using index; Using join buffer (Block Nested Loop)"
"1" "PRIMARY"   "promos"    "eq_ref"    "PRIMARY,promos_idx1"   "PRIMARY"   "4" "forex.distro_company_automatic_promo.promo_id" "1" "100"   "Using index"
"1" "PRIMARY"   "product_id_limits" "ref_or_null"   "distro_company_id_limits_idx1,product_id"  "distro_company_id_limits_idx1" "3" "const" "2" "100"   "Using where; Using index"
"1" "PRIMARY"   "payer_id_limits"   "ref"   "distro_company_id_limits_idx2,payer_id"    "distro_company_id_limits_idx2" "5" "distro_company_product_payers.payer_id"    "1" "100"   "Using index"
"1" "PRIMARY"   "distro_company_disabled_product"   "eq_ref"    "PRIMARY"   "PRIMARY"   "4" "forex.distro_company_product.id"   "1" "100"   "Using where; Not exists; Using index"
"2" "DERIVED"   "<derived4>"    "ALL"                   "301"   "100"   "Using where; Using temporary; Using filesort"
"2" "DERIVED"   "b" "ref"   "PRIMARY,distro_company_location_payer_idx1,location_id,payer_id"   "distro_company_location_payer_idx1"    "4" "c.id"  "150"   "100"   "Using where; Using index"
"2" "DERIVED"   "a" "ref"   "distro_company_product_location_idx1,location_id"  "distro_company_product_location_idx1"  "8" "forex.b.location_id"   "1" "100"   "Using where; Using index"
"4" "DERIVED"   "a" "index"     "distro_company_payers_idx1"    "1074"      "301"   "100"   "Using index; Using temporary; Using filesort"
"4" "DERIVED"   "b" "ALL"   "payer_to_replace_id,payer_to_replace_id_2"             "1" "100"   "Using where; Using join buffer (Block Nested Loop)"
"4" "DERIVED"   "c" "eq_ref"    "PRIMARY,distro_company_payers_idx1"    "PRIMARY"   "4" "forex.b.payer_id"  "1" "100"   
"3" "DEPENDENT SUBQUERY"    "d" "ALL"                   "1" "100"   "Using where"
"3" "DEPENDENT SUBQUERY"    "e" "ref"   "PRIMARY,product_id"    "PRIMARY"   "4" "forex.a.product_id"    "1" "100"   "Using where; Using index"

0 个答案:

没有答案