查询之间的SQL复合索引

时间:2016-07-01 12:11:26

标签: mysql sql indexing

我有一个名为survey_results的表,它将保存下面不同调查的数据,您可以找到该表的架构。

CREATE TABLE `survey_results` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `account_id` bigint(20) DEFAULT NULL,
  `survey_id` bigint(20) DEFAULT NULL,
  `customer_id` bigint(20) DEFAULT NULL,
  `agent_id` bigint(20) DEFAULT NULL,
  `created_at` datetime DEFAULT NULL,
  `updated_at` datetime DEFAULT NULL,
  `group_id` bigint(20) DEFAULT NULL,
  KEY `nameindex_on_account_id_and_survey_id` (`account_id`,`survey_id`),
  KEY `survey_results_id` (`id`),
  KEY `index_survey_results_on_acc_id_and_surv_id_and_created_and_group` (`account_id`,`survey_id`,`created_at`,`group_id`)
) ENGINE=InnoDB AUTO_INCREMENT=17 DEFAULT CHARSET=utf8

我刚刚为index_survey_results_on_acc_id_and_surv_id_and_created_and_group添加了一个新索引survey_results我对上述四个内容进行了过滤,这就是为什么我在此表上创建新索引,是可选的。

问题:

EXPLAIN SELECT `survey_results`.id
FROM `survey_results`
WHERE `survey_results`.`account_id` = 1 AND 
      `survey_results`.`survey_id` = 14 AND
      (survey_results.created_at between '2016-05-31 18:30:00' and '2016-07-01 18:29:59') AND
      (survey_results.group_id = '4')

以上查询未完全使用我的索引。它仅用于account_id和survey_id。

如果我在下面查询它是否正常工作。

EXPLAIN SELECT id FROM `survey_results` WHERE `account_id` = 1 AND `survey_id` = 14 AND (survey_results.created_at = '2016-06-30 17:22:24') AND (survey_results.group_id = '4');

那么查询之间的问题是什么?为提高效率所需的所有变化是什么?

1 个答案:

答案 0 :(得分:2)

您的查询的正确索引位于survey_results(account_id, survey_id, group_id, created_at)

相等条件中的所有列都应该在索引中排在第一位。然后,您可以添加一个具有不等式条件的键,例如between

相关问题