0

私は次の表を持っています:

  CREATE TABLE `sal_forwarding` (
  `sid` BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT,
  `f_shop` INT(11) NOT NULL,
  `f_offer` INT(11) DEFAULT NULL,
  .
  .
  .
  PRIMARY KEY (`sid`),
  KEY `forwardTime` (`forwardTime`,`f_shop`),
  KEY `forwardTime_2` (`forwardTime`),
  KEY `f_shop` (`f_shop`)
) ENGINE=INNODB AUTO_INCREMENT=10457068 DEFAULT CHARSET=latin1

このテーブルには500万を超える行があります。

上記のようにインデックスを設定しましたが、クエリではインデックスが使用されておらず、その理由がわかりません。誰かが私の問題を見ていますか?

説明:

EXPLAIN SELECT 
  f_shop
  , COUNT(sid)
  , SUM(IF(toolbarUser=1,1,0)) 
FROM sal_forwarding 
WHERE DATE(forwardTime) = "2011-09-01" 
GROUP BY f_shop

結果:

+----+-------------+----------------+-------+---------------+--------+---------+--------+--------+-------------+
| ID | SELECT_TYPE |     TABLE      | TYPE  | POSSIBLE_KEYS |  KEY   | KEY_LEN |  REF   |  ROWS  |    EXTRA    |
+----+-------------+----------------+-------+---------------+--------+---------+--------+--------+-------------+
|    |             |                |       |               |        |         |        |        |             |
| 1  | SIMPLE      | sal_forwarding | index | (NULL)        | f_shop | 4       | (NULL) | 232449 | Using where |
+----+-------------+----------------+-------+---------------+--------+---------+--------+--------+-------------+
4

1 に答える 1

2

MySQLは、関数内の列にインデックスを使用できません。
選択から関数を削除date()すると、MySQLがインデックスを使用します。

これを行うには、の列定義をに変更します。forwardtimeまたはDATE
、次のようにクエリを変更します。

SELECT 
  f_shop
  , COUNT(*) as RowCount
  , SUM(toolbarUser=1) as NumberOfToolbarUsers
FROM sal_forwarding 
WHERE forwardTime BETWEEN '2011-09-01 00:00' AND '2011-09-01 23:59' 
GROUP BY f_shop

備考

  • count(*)count(namedcolumn); よりも高速です。
  • (a = 1)=> trueの場合は1、(a = 1)=> 0の場合はfalseなので、if(a=1,1,0)を短縮できます。
  • 後でエイリアスで参照できるように、集計列にエイリアスを付けることをお勧めします。
  • 次のインデックスを追加する(およびインデックスを削除するforwardtime)と、クエリはさらに高速に実行されます。KEY fasttime (forwardTime,f_shop,toolbarUser)
  • 前のポイントは、MySQLが可能であればカバーリングインデックスを使用するInnoDBに特に当てはまります。つまり、インデックスで必要なものがすべて見つかった場合、テーブル自体を読み取ってデータを取得することはありません。
于 2011-09-27T12:40:32.567 に答える