2

次のようなSQLステートメントがあります。

SELECT colID
FROM tableName
WHERE ColDateStart <='$lowerDate'
AND ColDateStart>='$upperDate'
AND ColVcamID='$id1'
AND ColVlviID='$id2'
AND ColSomeID='$id3';

WHERE ステートメントのすべての列は、インデックス付きの列です。

これを実行すると、1 秒以上かかります。ただし、他の Id3 なしでこれを実行すると、パフォーマンスが大幅に向上します (0.03 秒)。

説明を実行すると、otherId3 で、otherId1 と otherId3 を使用したインデックス マージが使用されます。ただし、otherId3 を削除すると、otherId2 の単一のインデックスが使用されます。

otherId3 を追加するとパフォーマンスに影響するのはなぜですか?

テーブル構造:

+----------------------+-------------+------+-----+---------------------+----------------+
| Field                | Type        | Null | Key | Default             | Extra          |
+----------------------+-------------+------+-----+---------------------+----------------+
| ColID                | int(11)     | NO   | PRI | NULL                | auto_increment |
| ColCustID            | int(11)     | NO   | MUL | 0                   |                |
| ColCarrID            | int(11)     | NO   | MUL | NULL                |                |
| ColTariID            | int(11)     | NO   | MUL | 0                   |                |
| ColCarrierRef        | varchar(30) | NO   | MUL |                     |                |
| ColNumbID            | int(11)     | NO   | MUL | 0                   |                |
| ColVlviID            | int(11)     | NO   | MUL | NULL                |                |
| ColVcamID            | int(11)     | NO   | MUL | NULL                |                |
| ColSomeID            | int(11)     | NO   | MUL | NULL                |                |
| ColVlnsID            | int(11)     | NO   | MUL | NULL                |                |
| ColNGNumber          | varchar(12) | NO   |     |                     |                |
| ColOrigNumber        | varchar(16) | NO   | MUL | NULL                |                |
| ColCLIRestrictedFlag | int(2)      | NO   |     | NULL                |                |
| ColOrigLocality      | varchar(11) | NO   | MUL |                     |                |
| ColOrigAreaCode      | varchar(11) | NO   | MUL |                     |                |
| ColTermNumber        | varchar(16) | NO   | MUL | NULL                |                |
| ColBatchNumber       | varchar(10) | NO   |     |                     |                |
| ColDateStart         | date        | NO   | MUL | 0000-00-00          |                |
| ColDateClear         | date        | NO   |     | 0000-00-00          |                |
| ColTimeStart         | time        | NO   |     | 00:00:00            |                |
| ColTimeClear         | time        | NO   |     | 00:00:00            |                |
| ColCallLength        | time        | NO   |     | 00:00:00            |                |
| ColRingLength        | time        | NO   |     | 00:00:00            |                |
| ColEffectiveFlag     | smallint(1) | NO   | MUL | NULL                |                |
| ColUnansweredFlag    | smallint(1) | NO   | MUL | NULL                |                |
| ColEngagedFlag       | smallint(1) | NO   |     | NULL                |                |
| ColRecID             | int(11)     | NO   | MUL | NULL                |                |
| ColCreatedUserID     | int(11)     | NO   |     | 0                   |                |
| ColCreatedDatetime   | datetime    | NO   | MUL | 0000-00-00 00:00:00 |                |
| ColDirection         | int(1)      | NO   | MUL | NULL                |                |
+----------------------+-------------+------+-----+---------------------+----------------+

インデックス

+-------+------------+-------------------------------+--------------+---------------------+-----------+-------------+----------+--------+------+------------+---------+
| Table | Non_unique | Key_name                      | Seq_in_index | Column_name         | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment |
+-------+------------+-------------------------------+--------------+---------------------+-----------+-------------+----------+--------+------+------------+---------+
| tableName |          0 | PRIMARY                       |            1 | ColID              | A         |    18031283 |     NULL | NULL   |      | BTREE      |         |
| tableName |          1 | idx_ColCustID                |            1 | ColCustID          | A         |        1339 |     NULL | NULL   |      | BTREE      |         |
| tableName |          1 | idx_ColNumbID                |            1 | ColNumbID          | A         |       24366 |     NULL | NULL   |      | BTREE      |         |
| tableName |          1 | idx_colOrigNumber            |            1 | colOrigNumber      | A         |     4507820 |     NULL | NULL   |      | BTREE      |         |
| tableName |          1 | idx_colOrigLocality          |            1 | colOrigLocality    | A         |       36873 |     NULL | NULL   |      | BTREE      |         |
| tableName |          1 | idx_colOrigAreaCode          |            1 | colOrigAreaCode    | A         |         696 |     NULL | NULL   |      | BTREE      |         |
| tableName |          1 | idx_colTermNumber            |            1 | colTermNumber      | A         |      137643 |     NULL | NULL   |      | BTREE      |         |
| tableName |          1 | idx_colDateStart             |            1 | colDateStart       | A         |        3639 |     NULL | NULL   |      | BTREE      |         |
| tableName |          1 | idx_colEffectiveFlag         |            1 | colEffectiveFlag   | A         |           2 |     NULL | NULL   |      | BTREE      |         |
| tableName |          1 | idx_colUnansweredFlag        |            1 | colUnansweredFlag  | A         |           2 |     NULL | NULL   |      | BTREE      |         |
| tableName |          1 | idx_colEngagedFlag           |            1 | colUnansweredFlag  | A         |           2 |     NULL | NULL   |      | BTREE      |         |
| tableName |          1 | idx_colTariID                |            1 | colTariID          | A         |          91 |     NULL | NULL   |      | BTREE      |         |
| tableName |          1 | idx_CustID_DateStart          |            1 | colCustID          | A         |        1339 |     NULL | NULL   |      | BTREE      |         |
| tableName |          1 | idx_CustID_DateStart          |            2 | colDateStart       | A         |      693510 |     NULL | NULL   |      | BTREE      |         |
| tableName |          1 | idx_NumbID_DateStart          |            1 | colNumbID          | A         |       24366 |     NULL | NULL   |      | BTREE      |         |
| tableName |          1 | idx_NumbID_DateStart          |            2 | colDateStart       | A         |     4507820 |     NULL | NULL   |      | BTREE      |         |
| tableName |          1 | idx_colRecID                 |            1 | colRecID           | A         |      214658 |     NULL | NULL   |      | BTREE      |         |
| tableName |          1 | idx_colCarrierRef            |            1 | colCarrierRef      | A         |     6010427 |     NULL | NULL   |      | BTREE      |         |
| tableName |          1 | idx_colCustID_colTermNumber |            1 | colCustID          | A         |        1339 |     NULL | NULL   |      | BTREE      |         |
| tableName |          1 | idx_colCustID_colTermNumber |            2 | colTermNumber      | A         |      143105 |     NULL | NULL   |      | BTREE      |         |
| tableName |          1 | idx_colCreatedDatetime       |            1 | colCreatedDatetime | A         |      474507 |     NULL | NULL   |      | BTREE      |         |
| tableName |          1 | idx_colDirection             |            1 | colDirection       | A         |           2 |     NULL | NULL   |      | BTREE      |         |
| tableName |          1 | idx_colVlviID                |            1 | colVlviID          | A         |        4133 |     NULL | NULL   |      | BTREE      |         |
| tableName |          1 | idx_colSomeID                |            1 | colSomeID          | A         |          10 |     NULL | NULL   |      | BTREE      |         |
| tableName |          1 | idx_colVcamID                |            1 | colVcamID          | A         |           7 |     NULL | NULL   |      | BTREE      |         |
| tableName |          1 | idx_colVlnsID                |            1 | colVlnsID          | A         |          18 |     NULL | NULL   |      | BTREE      |         |
| tableName |          1 | idx_colCarrID                |            1 | colCarrID          | A         |           4 |     NULL | NULL   |      | BTREE      |         |
+-------+------------+-------------------------------+--------------+---------------------+-----------+-------------+----------+--------+------+------------+---------+
4

2 に答える 2

1

まず第一に、あなたもはるかに多くのインデックスを持っています。それらのインデックスのほとんどはおそらく無意味です。WHERE基準、JOIN、またはORDERINGに特定のインデックスを使用していない場合は、速度が低下するため、インデックスを削除してください。

次に、クエリに対して、1xDATE列と2xINT列で構成されるクエリに常に含まれる3つの列を指定します。日付範囲はインデックス上で非常に高速であるため、DATE列を最初に配置し、次に2つのINTを配置する必要があります。これにより、次の3列のインデックスの開始点が得られます。

CREATE INDEX searchIndex 
ON tableName (ColDateStart,ColVlviID,ColVcamID) 
USING BTREE;

詳細については、こちらをご覧ください: http: //dev.mysql.com/doc/refman/5.0/en/multiple-column-indexes.html

私は意図的にそのように列を注文しました。日付範囲フィルタリングのColDateStartに続いて、カーディナリティの降順で他の列が続きます。2番目の列としてColVlviIDを選択しました。これは、カーディナリティが7のColVcamIDと比較して、カーディナリティが4133であるためです。これにより、MySQLは一致する行をより効率的に減らすことができます。

ここで、colSomeIDが最後の列であると仮定すると、代わりに次のようにすることができます。

CREATE INDEX searchIndex_someID
ON tableName (ColDateStart,ColVlviID,ColVcamID,ColSomeID) 
USING BTREE;

この3列のインデックスは、MySQLが最後のIDをチェックする前に該当するデータセットにたどり着くのに役立ちます。別の特定のINT列で一般的にフィルタリングしている場合は、最適には、最後にそのインデックスに4番目の列を追加できます。

余談ですが、dateCol基準の代わりに次のことを検討することをお勧めします

SELECT colID
FROM tableName
WHERE ColDateStart BETWEEN DATE('$lowerDate') AND DATE('$upperDate')
AND ColVcamID=$id1
AND ColVlviID=$id2
AND ColSomeID=$id3

上記のすべてはもちろん、クエリを実行する前に変数をサニタイズしていることを前提としています。$ idx変数から引用符を削除しました。引用符は数値である必要があり、文字列として入力する必要がないためです。

于 2012-09-20T09:27:09.530 に答える
0
SELECT id
FROM tableName FORCE INDEX(`idx_otherId2`)
WHERE dateCol <='$lowerDate'
AND dateCol>='$upperDate'
AND otherId1='$id1'
AND otherId2='$id2'
AND otherId3='$id3';
于 2012-09-20T09:39:26.063 に答える