1

在我们的 MySQL 5.5 数据库中,我们有以下具有 30M+ 行的 InnoDB 表:

+----------------+-------------+-----------------+--------+
| participant_id | question_id | given_answer_id | status |
+----------------+-------------+-----------------+--------+
|       500      |      12     |        25       |    0   |
+----------------+-------------+-----------------+--------+

参与者id + question_id + given_answer_id 的组合是唯一的。

目前我们有以下键

主键(按此顺序)

  • 参与者ID
  • question_id
  • given_answer_id

索引键

  • question_id

对于这个表,我们的应用程序中有两种选择查询

[...] WHERE participant_id = x AND question_id = y AND given_answer_id = z;

[...] WHERE question_id = x;

通常,每个参与者 ID 都有 0 到 <100 行不同的 question_id。反过来说,每个 question_id 都可以有无限的(通常不超过 100 000 行)具有不同参与者 ID 的行。第一个查询比第二个查询更频繁地执行。

当我们执行以下查询时,它向我们显示了查找的32096 行

EXPLAIN SELECT * FROM example WHERE question_id = 500;

+----+-------------+-----------+------+---------------+-------------+---------+-------+-------+-------+
| id | select_type | table     | type | possible_keys | key         | key_len | ref   | rows  | Extra |
+----+-------------+-----------+------+---------------+-------------+---------+-------+-------+-------+
| 1  | SIMPLE      | example   | ref  | question_id   | question_id | 8       | const | 32096 |       |
+----+-------------+-----------+------+---------------+-------------+---------+-------+-------+-------+

然而,当我们在没有 EXPLAIN的情况下执行相同的查询时,只返回 18732 行

我们需要在这个表上使用什么索引来防止这种开销,但仍然对这两种查询都执行?


这是创建此表的代码:

创建表`示例`(
    `participant_id` BIGINT(20) UNSIGNED NOT NULL,
    `question_id` BIGINT(20) UNSIGNED NOT NULL,
    `given_answer_id` BIGINT(20) UNSIGNED NOT NULL,
    `status` TINYINT(3) UNSIGNED NOT NULL DEFAULT '0',
    主键(`participant_id`、`question_id`、`given_answer_id`),
    索引`question_id`(`question_id`)
)
引擎=InnoDB;
4

1 回答 1

0

我已按照建议将此问题发布到 dba.stackexchange.com,并收到了全面的答案:https ://dba.stackexchange.com/questions/49275/mysql-looking-up-more-rows-than-needed-indexing -问题

于 2013-09-09T09:04:40.933 回答