mysql - 如何优化低性能的MySQL查询

标签 mysql query-optimization

下面的查询使用下面的查询格式找到了一个 id,但似乎我已经为所有列建立了索引,但执行时间在 54.3 秒 - 1.2 分钟之间。接下来我可以尝试什么?

查询:

select 
  op.ord_prod_id 
FROM 
  ordered_product op, 
  payment_type pt, 
  account a, 
  service s, 
  payment_method pm, 
  acct_order ao, 
  acct_order_item aoi 
WHERE 
  (
    (
      op.type = 1 
      OR op.type = 2
    ) 
    AND (
      pt.description = 'Levis' 
      AND op.validity_end_date < '2022-09-18 11:24:08 Etc/GMT' 
      AND op.validity_end_date >= '2022-09-18 00:00:00 Etc/GMT' 
      AND op.acct_status_id = 1 
      AND op.is_Renewable = 'T' 
      AND a.bu_id = 103
    )
  ) 
  AND pm.type_id = pt.id 
  AND s.acct_id = a.acct_id 
  AND op.serv_id = s.serv_id 
  AND ao.pay_meth_id = pm.pay_method_id 
  AND aoi.order_id = ao.order_id 
  AND aoi.ord_prod_id = op.ord_prod_id 
ORDER BY 
  op.validity_end_date ASC

解释计划

*************************** 1. row ***************************
           id: 1
  select_type: SIMPLE
        table: pt
   partitions: NULL
         type: ref
possible_keys: PRIMARY,idx_pmttype_descrip,idx_description
          key: idx_pmttype_descrip
      key_len: 32
          ref: const
         rows: 1
     filtered: 100.00
        Extra: Using index; Using temporary; Using filesort
*************************** 2. row ***************************
           id: 1
  select_type: SIMPLE
        table: pm
   partitions: NULL
         type: ref
possible_keys: PRIMARY,payment_method_type_id,Idx_type_id,idx_type_id_zip_code_last_digits
          key: payment_method_type_id
      key_len: 10
          ref: ccbuser.pt.id
         rows: 3297
     filtered: 100.00
        Extra: Using index
*************************** 3. row ***************************
           id: 1
  select_type: SIMPLE
        table: ao
   partitions: NULL
         type: ref
possible_keys: PRIMARY,idx_pay_meth_id
          key: idx_pay_meth_id
      key_len: 11
          ref: ccbuser.pm.pay_method_id
         rows: 2
     filtered: 100.00
        Extra: Using index
*************************** 4. row ***************************
           id: 1
  select_type: SIMPLE
        table: aoi
   partitions: NULL
         type: ref
possible_keys: idx_accttorderitem_orderid,idx_ord_prod_id
          key: idx_accttorderitem_orderid
      key_len: 10
          ref: ccbuser.ao.order_id
         rows: 1
     filtered: 100.00
        Extra: NULL
*************************** 5. row ***************************
           id: 1
  select_type: SIMPLE
        table: op
   partitions: NULL
         type: eq_ref
possible_keys: PRIMARY,idx_ord_prod_servid,idx_ord_prod_statprod,idx_ordprod_type,idx_ord_prod_ve_date,idx_ord_prod_acct_status_id,idx_combo,idx_is_renewable,idx_validity_package_ind_acct_status
          key: PRIMARY
      key_len: 10
          ref: ccbuser.aoi.ord_prod_id
         rows: 1
     filtered: 5.00
        Extra: Using where
*************************** 6. row ***************************
           id: 1
  select_type: SIMPLE
        table: s
   partitions: NULL
         type: eq_ref
possible_keys: PRIMARY,idx_service_acctid
          key: PRIMARY
      key_len: 10
          ref: ccbuser.op.serv_id
         rows: 1
     filtered: 100.00
        Extra: NULL
*************************** 7. row ***************************
           id: 1
  select_type: SIMPLE
        table: a
   partitions: NULL
         type: eq_ref
possible_keys: PRIMARY,idx_account_buidasid,idx_combo,idx_bu_id,idx_1
          key: PRIMARY
      key_len: 10
          ref: ccbuser.s.acct_id
         rows: 1
     filtered: 5.00
        Extra: Using where
7 rows in set, 11 warnings (0.03 sec)

我已经给出了显示警告;

*************************** 1. row ***************************
  Level: Warning
   Code: 1292
Message: Incorrect datetime value: '2022-09-18 11:24:08 Etc/GMT' for column 'validity_end_date' at row 1
*************************** 2. row ***************************
  Level: Warning
   Code: 1292
Message: Incorrect datetime value: '2022-09-18 00:00:00 Etc/GMT' for column 'validity_end_date' at row 1
*************************** 3. row ***************************
  Level: Warning
   Code: 1292
Message: Incorrect datetime value: '2022-09-18 11:24:08 Etc/GMT' for column 'validity_end_date' at row 1
*************************** 4. row ***************************
  Level: Warning
   Code: 1292
Message: Incorrect datetime value: '2022-09-18 11:24:08 Etc/GMT' for column 'validity_end_date' at row 1
*************************** 5. row ***************************
  Level: Warning
   Code: 1292
Message: Incorrect datetime value: '2022-09-18 11:24:08 Etc/GMT' for column 'validity_end_date' at row 1
*************************** 6. row ***************************
  Level: Warning
   Code: 1292
Message: Incorrect datetime value: '2022-09-18 11:24:08 Etc/GMT' for column 'validity_end_date' at row 1
*************************** 7. row ***************************
  Level: Warning
   Code: 1292
Message: Incorrect datetime value: '2022-09-18 00:00:00 Etc/GMT' for column 'validity_end_date' at row 1
*************************** 8. row ***************************
  Level: Warning
   Code: 1292
Message: Incorrect datetime value: '2022-09-18 00:00:00 Etc/GMT' for column 'validity_end_date' at row 1
*************************** 9. row ***************************
  Level: Warning
   Code: 1292
Message: Incorrect datetime value: '2022-09-18 00:00:00 Etc/GMT' for column 'validity_end_date' at row 1
*************************** 10. row ***************************
  Level: Warning
   Code: 1292
Message: Incorrect datetime value: '2022-09-18 00:00:00 Etc/GMT' for column 'validity_end_date' at row 1
*************************** 11. row ***************************
  Level: Note
   Code: 1003
Message: /* select#1 */ select 
  .`op`.`ord_prod_id` AS `ord_prod_id` 
from 
  `ordered_product` `op` 
  join `payment_type` `pt` 
  join `account` `a` 
  join `service` `s` 
  join `payment_method` `pm` 
  join `acct_order` `ao` 
  join `acct_order_item` `aoi` 
where 
  (
    (
      `op`.`ord_prod_id` = `aoi`.`ord_prod_id`
    ) 
    and (
      `aoi`.`order_id` = `ao`.`order_id`
    ) 
    and (
      `ao`.`pay_meth_id` = `pm`.`pay_method_id`
    ) 
    and (
      `s`.`serv_id` = `op`.`serv_id`
    ) 
    and (
      `a`.`acct_id` = `s`.`acct_id`
    ) 
    and (
      `pm`.`type_id` = `pt`.`id`
    ) 
    and (
      `op`.`is_Renewable` = 'T'
    ) 
    and (
      `pt`.`description` = 'Credit Card'
    ) 
    and (
      (`op`.`type` = 1) 
      or (`op`.`type` = 2)
    ) 
    and (
      `op`.`validity_end_date` < '2022-09-18 11:24:08 Etc/GMT'
    ) 
    and (
      `op`.`validity_end_date` >= '2022-09-18 00:00:00 Etc/GMT'
    ) 
    and (
      `op`.`acct_status_id` = 1
    ) 
    and (`a`.`bu_id` = 103)
  ) 
order by 
  `op`.`validity_end_date`

所有行扫描一行,其中一些行扫描 3k 一行 - 我是否必须对上面的行使用 str_to_date 函数,有什么方法可以提高性能吗?

表结构:

       Table: ordered_product
Create Table: CREATE TABLE `ordered_product` (
  `acct_status_id` decimal(22,0) NOT NULL,
  `anual_prepay_ind` varchar(1) CHARACTER SET latin1 COLLATE latin1_bin DEFAULT NULL,
  `bill_end_date` datetime DEFAULT NULL,
  `bill_start_date` datetime DEFAULT NULL,
  `equip_id` decimal(22,0) DEFAULT NULL,
  `ord_prod_id` decimal(22,0) NOT NULL,
  `package_id` decimal(22,0) DEFAULT NULL,
  `package_ind` varchar(1) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL,
  `parent_ord_prod_id` decimal(22,0) DEFAULT NULL,
  `prod_id` decimal(22,0) DEFAULT NULL,
  `quantity` decimal(38,0) DEFAULT NULL,
  `remove_flag` varchar(1) CHARACTER SET latin1 COLLATE latin1_bin DEFAULT NULL,
  `serv_id` decimal(22,0) NOT NULL,
  `srv_end_date` datetime DEFAULT NULL,
  `srv_start_date` datetime DEFAULT NULL,
  `split_prod_id` decimal(22,0) DEFAULT NULL,
  `term` decimal(22,0) DEFAULT NULL,
  `type` decimal(22,0) DEFAULT NULL,
  `tax_charged` decimal(20,6) DEFAULT NULL,
  `comments` varchar(4000) DEFAULT NULL,
  `reason_code_id` decimal(20,0) DEFAULT NULL,
  `price_charged` decimal(20,2) DEFAULT NULL,
  `validity_period` varchar(20) DEFAULT NULL,
  `validity_duration` decimal(38,0) DEFAULT NULL,
  `validity_end_date` datetime DEFAULT NULL,
  `coupon_amount` decimal(20,2) DEFAULT NULL,
  `coupon_code` varchar(100) DEFAULT NULL,
  `applied_wallet_amount` decimal(20,2) DEFAULT NULL,
  `applied_rate_type` varchar(100) DEFAULT NULL,
  `partner_domain` varchar(100) DEFAULT NULL,
  `is_Renewable` varchar(1) DEFAULT NULL,
  `coupon_external_id` varchar(256) DEFAULT NULL,
  `validity_extended_date` datetime DEFAULT NULL,
  `cancellation_date` datetime DEFAULT NULL,
  `rec_indicator` varchar(1) DEFAULT NULL,
  `suspend_start_date` datetime DEFAULT NULL,
  `suspend_end_date` datetime DEFAULT NULL,
  `suspend_duration` decimal(20,0) DEFAULT NULL,
  `commitment_end_date` datetime DEFAULT NULL,
  `modified_ts` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  `contact_id` varchar(30) DEFAULT NULL,
  `subscription_status_id` decimal(22,0) DEFAULT NULL,
  `bu_charged_currency_id` decimal(38,0) DEFAULT NULL,
  `currency_code` varchar(200) DEFAULT NULL,
  `legacy_id` varchar(200) DEFAULT NULL,
  `app_service_id` varchar(200) DEFAULT NULL,
  `app_channel_name` varchar(200) DEFAULT NULL,
  `applied_prod_rate_id` decimal(22,0) DEFAULT NULL,
  `applied_prod_rate_in_charged_currency_id` decimal(22,0) DEFAULT NULL,
  `applied_prod_price` decimal(22,0) DEFAULT NULL,
  `bill_to_parent` varchar(1) DEFAULT NULL,
  PRIMARY KEY (`ord_prod_id`),
  KEY `idx_ord_prod_servid` (`serv_id`),
  KEY `idx_ord_prod_statprod` (`acct_status_id`,`prod_id`,`package_id`),
  KEY `idx_ord_prod_bs_date` (`bill_start_date`),
  KEY `idx_ord_prod_be_date` (`bill_end_date`),
  KEY `ordered_product_modified_ts` (`modified_ts`),
  KEY `idx_ordprod_type` (`type`),
  KEY `idx_ord_prod_ve_date` (`validity_end_date`),
  KEY `idx_ord_prod_prod_id` (`prod_id`),
  KEY `idx_ord_prod_srv_start_date` (`srv_start_date`),
  KEY `idx_ord_prod_pack_id` (`package_id`),
  KEY `idx_ord_prod_acct_status_id` (`acct_status_id`),
  KEY `idx_ord_prod_validity_extend_dt` (`validity_extended_date`),
  KEY `idx_remove_flag` (`remove_flag`),
  KEY `idx_ord_prod_srv_end_date` (`srv_end_date`),
  KEY `idx_subscription_status_id` (`subscription_status_id`),
  KEY `idx_coupon_code` (`coupon_code`),
  KEY `idx_parent_ord_prod_id` (`parent_ord_prod_id`),
  KEY `idx_combo` (`type`,`serv_id`),
  KEY `idx_is_renewable` (`is_Renewable`),
  KEY `idx_package_ind` (`package_ind`),
  KEY `idx_validity_package_ind_acct_status` (`validity_end_date`,`package_ind`,`acct_status_id`),
  KEY `idx_legacyid` (`legacy_id`),
  KEY `idx_cancellation_date` (`cancellation_date`),
  KEY `idx_suspend_start_date` (`suspend_start_date`),
  KEY `idx_suspend_end_date_validity_end_date_combo` (`suspend_end_date`,`validity_end_date`,`acct_status_id`,`is_Renewable`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1


       Table: payment_type
Create Table: CREATE TABLE `payment_type` (
  `auto_pay_capable_ind` varchar(1) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL,
  `can_post_credit_ind` varchar(1) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL,
  `check_number_ind` varchar(1) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL,
  `description` varchar(30) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL,
  `display_order` decimal(22,0) NOT NULL,
  `id` decimal(22,0) NOT NULL,
  `requires_gateway_ind` varchar(1) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL,
  `display_name` varchar(30) DEFAULT NULL,
  `modified_ts` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  `image_url` varchar(4096) DEFAULT NULL,
  `short_code` varchar(20) DEFAULT NULL,
  `payment_group` varchar(100) DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `idx_pmttype_descrip` (`description`),
  KEY `idx_display_name` (`display_name`),
  KEY `idx_description` (`description`),
  KEY `idx_payment_group` (`payment_group`),
  KEY `idx_modified_ts` (`modified_ts`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1


       Table: account
Create Table: CREATE TABLE `account` (
  `acct_id` decimal(22,0) NOT NULL,
  `acct_status_id` decimal(22,0) NOT NULL,
  `acct_type_id` decimal(22,0) DEFAULT NULL,
  `attach_bill_cycle` char(1) CHARACTER SET latin1 COLLATE latin1_bin DEFAULT NULL,
  `bb_acct_id` varchar(256) DEFAULT NULL,
  `bill_del_type_id` decimal(22,0) DEFAULT NULL,
  `acct_bill_mode` varchar(20) CHARACTER SET latin1 COLLATE latin1_bin DEFAULT NULL,
  `bu_id` decimal(22,0) NOT NULL,
  `acct_comment` varchar(500) CHARACTER SET latin1 COLLATE latin1_bin DEFAULT NULL,
  `compliment_acct` varchar(1) CHARACTER SET latin1 COLLATE latin1_bin DEFAULT NULL,
  `contact_id` decimal(22,0) NOT NULL,
  `corporate_id` decimal(22,0) DEFAULT NULL,
  `create_date` datetime NOT NULL,
  `customer_id` varchar(100) DEFAULT NULL,
  `direct_acct` varchar(1) CHARACTER SET latin1 COLLATE latin1_bin DEFAULT NULL,
  `do_not_auto_script` char(5) CHARACTER SET latin1 COLLATE latin1_bin DEFAULT NULL,
  `email_inv_format` varchar(25) CHARACTER SET latin1 COLLATE latin1_bin DEFAULT NULL,
  `external_id_prefix` varchar(6) CHARACTER SET latin1 COLLATE latin1_bin DEFAULT NULL,
  `external_id_suffix` varchar(25) DEFAULT NULL,
  `inter_pic_id` varchar(4) CHARACTER SET latin1 COLLATE latin1_bin DEFAULT NULL,
  `intra_pic_id` varchar(4) CHARACTER SET latin1 COLLATE latin1_bin DEFAULT NULL,
  `legacy_id` decimal(22,0) DEFAULT NULL,
  `parent_id` decimal(22,0) DEFAULT NULL,
  `partner_id` decimal(22,0) DEFAULT NULL,
  `psa_acct_id` varchar(20) CHARACTER SET latin1 COLLATE latin1_bin DEFAULT NULL,
  `acct_reg_num` varchar(25) CHARACTER SET latin1 COLLATE latin1_bin DEFAULT NULL,
  `sales_method` varchar(100) DEFAULT NULL,
  `shipping_add_id` decimal(22,0) DEFAULT NULL,
  `tax_exempt` varchar(1) CHARACTER SET latin1 COLLATE latin1_bin DEFAULT NULL,
  `tax_number` varchar(20) CHARACTER SET latin1 COLLATE latin1_bin DEFAULT NULL,
  `tv_dma_id` varchar(30) CHARACTER SET latin1 COLLATE latin1_bin DEFAULT NULL,
  `status_change_date` datetime DEFAULT NULL,
  `external_creation_date` date DEFAULT NULL,
  `sales_person` varchar(200) DEFAULT NULL,
  `offer_type` varchar(50) DEFAULT NULL,
  `cancel_reasons_id` int(38) DEFAULT NULL,
  `acct_addl_info_id` decimal(38,0) DEFAULT NULL,
  `vpn_id` decimal(22,0) DEFAULT NULL,
  `verified` varchar(1) DEFAULT NULL,
  `verified_channel` varchar(50) DEFAULT NULL,
  `active_logins_count` decimal(20,0) DEFAULT NULL,
  `acct_role_id` decimal(20,0) DEFAULT NULL,
  `mso_id` varchar(200) DEFAULT NULL,
  `mso_name` varchar(200) DEFAULT NULL,
  `anonymized` varchar(1) DEFAULT NULL,
  `parental_control` varchar(1) DEFAULT NULL,
  `act_state_id` decimal(38,0) DEFAULT NULL,
  `verified_date` datetime DEFAULT NULL,
  `complaintmode_acct` varchar(1) DEFAULT NULL,
  `modified_ts` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  `mobile_verified` varchar(1) DEFAULT NULL,
  `acct_sub_type_id` decimal(22,0) DEFAULT NULL,
  `created_by` decimal(22,0) DEFAULT NULL,
  `ip_address` varchar(50) DEFAULT NULL,
  PRIMARY KEY (`acct_id`),
  KEY `idx_account_customer_id` (`customer_id`),
  KEY `idx_account_buidasid` (`bu_id`,`acct_status_id`),
  KEY `idx_account_bbaccountid` (`bb_acct_id`),
  KEY `idx_create_date` (`create_date`),
  KEY `idx_contact_id` (`contact_id`),
  KEY `idx_attach_bill_cycle` (`attach_bill_cycle`),
  KEY `idx_act_state` (`act_state_id`),
  KEY `idx_accountt_legacyid` (`legacy_id`),
  KEY `account_modified_ts` (`modified_ts`),
  KEY `idx_account_acctroleid` (`acct_role_id`),
  KEY `idx_extrnl_suffix` (`external_id_suffix`),
  KEY `idx_extrnl_prefix` (`external_id_prefix`),
  KEY `idx_combo` (`bu_id`,`psa_acct_id`),
  KEY `idx_bu_id` (`bu_id`),
  KEY `idx_acct_reg_num` (`acct_reg_num`),
  KEY `idx_acct_stat_id` (`acct_status_id`),
  KEY `account_idx_combo4` (`tax_number`,`acct_id`,`contact_id`,`bu_id`),
  KEY `idx_1` (`bu_id`,`customer_id`),
  KEY `idx_acct_type_id` (`acct_type_id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1



       Table: service
Create Table: CREATE TABLE `service` (
  `acct_id` decimal(22,0) NOT NULL,
  `acct_status_id` decimal(22,0) DEFAULT NULL,
  `do_not_auto_script` char(5) CHARACTER SET latin1 COLLATE latin1_bin DEFAULT NULL,
  `end_date` datetime DEFAULT NULL,
  `last_billed` datetime DEFAULT NULL,
  `loc_id` decimal(22,0) DEFAULT NULL,
  `serv_id` decimal(22,0) NOT NULL,
  `start_date` datetime NOT NULL,
  `type` decimal(22,0) DEFAULT NULL,
  `suspend_start_date` date DEFAULT NULL,
  `suspend_end_date` date DEFAULT NULL,
  `pending_suspension_date` date DEFAULT NULL,
  `reactivation_date` date DEFAULT NULL,
  `suspend_duration` decimal(20,0) DEFAULT NULL,
  `modified_ts` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`serv_id`),
  KEY `idx_service_acctid` (`acct_id`),
  KEY `idx_service_locid` (`loc_id`),
  KEY `service_modified_ts` (`modified_ts`),
  KEY `idx_service_modified_ts` (`modified_ts`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1


       Table: payment_method
Create Table: CREATE TABLE `payment_method` (
  `account_number` varchar(200) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL,
  `bob_id` decimal(22,0) DEFAULT NULL,
  `closed_date` datetime DEFAULT NULL,
  `pay_method_id` decimal(22,0) NOT NULL,
  `start_date` datetime NOT NULL,
  `type_id` decimal(22,0) NOT NULL,
  `credit_card_type_id` decimal(22,0) DEFAULT NULL,
  `expiration_date` datetime DEFAULT NULL,
  `name` varchar(100) DEFAULT NULL,
  `pay_meth_type_id` decimal(22,0) NOT NULL,
  `security_code` varchar(100) CHARACTER SET latin1 COLLATE latin1_bin DEFAULT NULL,
  `str_addr` varchar(250) DEFAULT NULL,
  `zip_code` varchar(10) DEFAULT NULL,
  `acct_type_id` decimal(22,0) DEFAULT NULL,
  `bank_name` varchar(512) DEFAULT NULL,
  `bank_phone` varchar(15) CHARACTER SET latin1 COLLATE latin1_bin DEFAULT NULL,
  `rtn` varchar(20) CHARACTER SET latin1 COLLATE latin1_bin DEFAULT NULL,
  `city` varchar(100) DEFAULT NULL,
  `drivers_license` varchar(20) CHARACTER SET latin1 COLLATE latin1_bin DEFAULT NULL,
  `email` varchar(256) DEFAULT NULL,
  `sent_out` varchar(1) CHARACTER SET latin1 COLLATE latin1_bin DEFAULT NULL,
  `ssn` varchar(30) CHARACTER SET latin1 COLLATE latin1_bin DEFAULT NULL,
  `state` varchar(4) CHARACTER SET latin1 COLLATE latin1_bin DEFAULT NULL,
  `country` varchar(30) DEFAULT NULL,
  `storage_token` varchar(200) DEFAULT NULL,
  `payer_id` varchar(50) DEFAULT NULL,
  `last_digits` varchar(4) DEFAULT NULL,
  `ref_number` varchar(50) DEFAULT NULL,
  `phone_number` varchar(20) DEFAULT NULL,
  `dc_code` varchar(20) DEFAULT NULL,
  `xid` varchar(250) DEFAULT NULL,
  `eci` varchar(5) DEFAULT NULL,
  `cavv` varchar(250) DEFAULT NULL,
  `ucaf_authentication_data` varchar(250) DEFAULT NULL,
  `ucaf_collection_ind` varchar(5) DEFAULT NULL,
  `subscription_id` varchar(50) DEFAULT NULL,
  `effort_id` decimal(10,0) DEFAULT NULL,
  `receipt_data` longtext,
  `transaction_id` varchar(512) DEFAULT NULL,
  `org_transaction_id` varchar(512) DEFAULT NULL,
  `tax_area_id` varchar(30) DEFAULT NULL,
  `modified_ts` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  `nick_name` varchar(100) DEFAULT NULL,
  `iin` varchar(8) DEFAULT NULL,
  `allow_unlimited` tinyint(1) DEFAULT NULL,
  `name_of_bank` varchar(100) DEFAULT NULL,
  `card_number` varchar(100) DEFAULT NULL,
  `pin` varchar(20) DEFAULT NULL,
  `card_finger_print` varchar(200) DEFAULT NULL,
  `card_issuer_country` varchar(30) DEFAULT NULL,
  `card_service_provider` varchar(512) DEFAULT NULL,
  PRIMARY KEY (`pay_method_id`),
  KEY `payment_method_modified_ts` (`modified_ts`),
  KEY `idx_pmtmethod_transid` (`transaction_id`),
  KEY `idx_payment_method_start_dt` (`start_date`),
  KEY `payment_method_start_date` (`start_date`),
  KEY `payment_method_bob_id` (`bob_id`),
  KEY `payment_method_type_id` (`type_id`),
  KEY `idx_pm_accountno` (`account_number`),
  KEY `idx_exp_date` (`expiration_date`),
  KEY `idx_org_transaction_id` (`org_transaction_id`),
  KEY `idx_transaction_id` (`transaction_id`),
  KEY `Idx_bob_id` (`bob_id`),
  KEY `idx_account_number` (`account_number`),
  KEY `Idx_type_id` (`type_id`),
  KEY `i_modified_ts` (`modified_ts`),
  KEY `idx_last_digits` (`last_digits`),
  KEY `idx_ref_number` (`ref_number`),
  KEY `ix_refer_num` (`ref_number`),
  KEY `idx_zipcode` (`zip_code`),
  KEY `idx_card_fingerprint` (`card_finger_print`),
  KEY `idx_phone_number` (`phone_number`),
  KEY `idx_type_id_zip_code_last_digits` (`type_id`,`zip_code`,`last_digits`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1


       Table: acct_order
Create Table: CREATE TABLE `acct_order` (
  `acct_id` decimal(22,0) NOT NULL,
  `ao_wf_instance_id` decimal(22,0) DEFAULT NULL,
  `comm` varchar(4000) CHARACTER SET latin1 COLLATE latin1_bin DEFAULT NULL,
  `comment_id` decimal(38,0) DEFAULT NULL,
  `external_status` varchar(50) CHARACTER SET latin1 COLLATE latin1_bin DEFAULT NULL,
  `house_hold_user` varchar(60) CHARACTER SET latin1 COLLATE latin1_bin DEFAULT NULL,
  `legacy_id` varchar(200) DEFAULT NULL,
  `modify_date` datetime NOT NULL,
  `order_id` decimal(22,0) NOT NULL,
  `promise_date` datetime NOT NULL,
  `remove_flag` varchar(1) CHARACTER SET latin1 COLLATE latin1_bin DEFAULT NULL,
  `serv_id` decimal(22,0) DEFAULT NULL,
  `txn_id` decimal(22,0) DEFAULT NULL,
  `workflow_instance_id` decimal(22,0) DEFAULT NULL,
  `external_order_id` varchar(200) DEFAULT NULL,
  `ref_number` varchar(200) DEFAULT NULL,
  `pmt_profile_id` varchar(2048) DEFAULT NULL,
  `pay_meth_id` decimal(22,0) DEFAULT NULL,
  `modified_ts` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  `txn_summary_id` int(38) DEFAULT NULL,
  `country` varchar(10) DEFAULT NULL,
  `recon_required` varchar(50) DEFAULT NULL,
  PRIMARY KEY (`order_id`),
  KEY `idx_acctorder_acctid` (`acct_id`),
  KEY `idx_acctorder_wfiid` (`workflow_instance_id`),
  KEY `idx_acctorder_servid` (`serv_id`),
  KEY `idx_ao_mod_dt` (`modify_date`),
  KEY `idx_ext_id` (`external_order_id`),
  KEY `acct_order_modified_ts` (`modified_ts`),
  KEY `idx_pmt_profile_id` (`pmt_profile_id`),
  KEY `idx_ref_number` (`ref_number`),
  KEY `idx_pay_meth_id` (`pay_meth_id`),
  KEY `idx_txn_id` (`txn_id`),
  KEY `idx_promise_date` (`promise_date`),
  KEY `idx_modified_ts` (`modified_ts`),
  KEY `idx_ao_wf_instance_id` (`ao_wf_instance_id`),
  KEY `idx_acct_id_legacy_id` (`acct_id`,`legacy_id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1


       Table: acct_order_item
Create Table: CREATE TABLE `acct_order_item` (
  `modify_date` datetime NOT NULL,
  `ord_prod_id` decimal(22,0) NOT NULL,
  `order_id` decimal(22,0) NOT NULL,
  `order_item_id` decimal(22,0) NOT NULL,
  `modified_ts` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`order_item_id`),
  KEY `idx_accttorderitem_orderid` (`order_id`),
  KEY `idx_ord_prod_id` (`ord_prod_id`),
  KEY `acct_order_item_modified_ts` (`modified_ts`),
  KEY `idx_acct_order_item_modified_ts` (`modified_ts`),
  KEY `idx_modified_ts` (`modified_ts`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1

最佳答案

重新安排您的查询,您会得到这个...

SELECT
  op.ord_prod_id 
FROM 
  account             AS a
INNER JOIN
  service             AS s
    ON s.acct_id = a.acct_id
INNER JOIN
  ordered_product     AS op
    ON op.serv_id = s.serv_id
INNER JOIN
  acct_order_item     AS aoi
    ON aoi.ord_prod_id = op.ord_prod_id
INNER JOIN
  acct_order          AS ao
    ON aoi.order_id = ao.order_id
INNER JOIN
  payment_method      AS pm
    ON ao.pay_meth_id = pm.pay_method_id
INNER JOIN
  payment_type        AS pt
    ON pm.type_id = pt.id
WHERE 
      a.bu_id = 103
  AND op.type IN (1,2)
  AND op.validity_end_date < '2022-09-18 11:24:08 Etc/GMT' 
  AND op.validity_end_date >= '2022-09-18 00:00:00 Etc/GMT'
  AND op.acct_status_id = 1 
  AND op.is_Renewable = 'T' 
  AND pt.description = 'Levis' 
ORDER BY 
  op.validity_end_date ASC

这在我看来是错误的,但如果没有数据库模式我就无法判断。

这就是为什么我认为这是错误的......

  • 获取bu_id = 103的所有账户
  • 获取所有这些帐户的服务(同一服务可能出现多次)
  • 获取与这些服务关联的所有订购产品无论帐户

我强烈怀疑 acct_order 有一个 acct_id 列,这可能会启用类似这样的东西......

SELECT
  op.ord_prod_id 
FROM 
  account             AS a
INNER JOIN
  acct_order          AS ao
    ON ao.acct_id = a.acct_id

INNER JOIN
  payment_method      AS pm
    ON pm.pay_method_id = ao.pay_meth_id
INNER JOIN
  payment_type        AS pt
    ON pt.id = pm.type_id

INNER JOIN
  acct_order_item     AS aoi
    ON aoi.order_id = ao.order_id
INNER JOIN
  ordered_product     AS op
    ON op.ord_prod_id = aoi.ord_prod_id
--
-- No need to join on service now
--
WHERE 
      a.bu_id = 103
  AND pt.description = 'Levis' 
  AND op.type IN (1,2)
  AND op.acct_status_id = 1 
  AND op.is_Renewable = 'T' 
  AND op.validity_end_date >= '2022-09-18 00:00:00 Etc/GMT'
  AND op.validity_end_date <  '2022-09-18 11:24:08 Etc/GMT' 
ORDER BY 
  op.validity_end_date ASC

仅此一项就可能会减少正在处理的行数,并深入了解您想要的索引,可能是...

account (bu_id, acct_id)
acct_order (acct_id, pay_meth_id, order_id)

payment_method (pay_method_id, type_id) or (type_id, pay_method_id)
payment_type (id, description) or (description, id)

acct_order_item (order_id, ord_prod_id)
ordered_product (type, acct_status_id, is_renewable, validity_end_date, ord_prod_id)

您还应该修复 WHERE 子句中使用的日期文字。


无论哪种方式,如果您想要更明确的响应,您需要包含这些表的完整架构,包括索引和外键(以验证您的连接)以及行数、基数等(以指导您索引创建、性能调整等)。

关于mysql - 如何优化低性能的MySQL查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74029238/

相关文章:

mysql - SQLite 转储中的 CREATE TABLE 语法错误 (1064)

c# - 将列表转换为逗号分隔的 MySQL 插入语句

MySQL,替代使用 IN 哪个会优先考虑第一个值?

postgresql - 与 PostgreSQL CTE 的一般并行性

WHERE 子句中带有子查询的 MYSQL UPDATE 查询 - 优化

MySQL - 使用created_date和updated_date?

mysql - 具有不同值的多个表上的 SQL 左连接

mongodb - 将 $match 聚合的子集结果保存在 mongoDB 的缓存中

php - SQL 根据表 B 中的条件返回表 A 的结果

mysql - Datamapper 是否支持 'On Duplicate Key Update' 或其他更新插入技术?