2

以下具有不同限制计数的查询,制定出不同的查询计划和非常不同的扫描行:

mysql> explain SELECT * FROM `funds_cash_apply` WHERE 1 and `id` > '0' and `channel` in ('70','81') and `state` = '1' and `state_pay` = '0' and `create_time` < '1447063200' order by id asc limit 50 \G
*************************** 1. row ***************************
           id: 1
  select_type: SIMPLE
        table: funds_cash_apply
         type: range
possible_keys: PRIMARY,idx_state_state_e
          key: PRIMARY
      key_len: 4
          ref: NULL
         rows: 373619
        Extra: Using where
1 row in set (0.00 sec)

mysql> explain SELECT * FROM `funds_cash_apply` WHERE 1 and `id` > '0' and `channel` in ('70','81') and `state` = '1' and `state_pay` = '0' and `create_time` < '1447063200' order by id asc limit 5000 \G
*************************** 1. row ***************************
           id: 1
  select_type: SIMPLE
        table: funds_cash_apply
         type: ref
possible_keys: PRIMARY,idx_state_state_e
          key: idx_state_state_e
      key_len: 1
          ref: const
         rows: 6652
        Extra: Using index condition; Using where; Using filesort
1 row in set (0.00 sec)

带有索引的表:

  PRIMARY KEY (`id`),
  UNIQUE KEY `idx_water_no` (`water_no`,`state`) USING BTREE,
  KEY `idx_kdt_id` (`kdt_id`,`state`,`create_time`) USING BTREE,
  KEY `idx_batch_id` (`batch_water_no`,`state`) USING BTREE,
  KEY `idx_cp_uid` (`cp_uid`,`state`,`create_time`),
  KEY `idx_acct_no` (`acct_no`,`state`,`create_time`),
  KEY `idx_state_state_e` (`state`,`state_exception`) USING BTREE

为什么不同的limit(50 vs 500)做出不同的查询计划,扫描行有很大的变化?</p>

4

0 回答 0