2

我有一个如下所示的 sql 语句:

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

WHERE 语句中的所有列都是索引列。

当我运行它时,它需要一秒钟。但是,当我在没有其他 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 使用特定索引,请删除它,因为它只会减慢速度。

接下来,为您的查询指定 3 列,这些列始终在查询中,包括 1x DATE 和 2x INT 列。DATE 列应该是第一个,因为日期范围在索引上非常快,然后是两个 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 用于日期范围过滤,然后按基数降序排列其他列。我选择 ColVlviID 作为第二列,因为它的基数为 4133,而 ColVcamID 的基数为 7。这将允许 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 回答