MySQL查询性能似乎与参数数量呈线性关系?

时间:2017-09-28 14:14:46

标签: mysql sql

我有这样的设置:

  • 使用mysql 5.5
  • 建筑物有一套测量设备
  • 测量结果存储在measured -table
  • 有多种不同类型
  • 用户可以访问整栋建筑或一套设备
  • 几百万次测量

表格创建如下:

CREATE TABLE `measurements` (
`id` INT(11) UNSIGNED NOT NULL AUTO_INCREMENT,
`timestamp` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
`building_id` INT(10) UNSIGNED NOT NULL,
`equipment_id` INT(10) UNSIGNED NOT NULL,
`state` ENUM('normal','high','low','alarm','error') NOT NULL DEFAULT 'normal',
`measurement_type` VARCHAR(50) NULL DEFAULT NULL,
PRIMARY KEY (`id`),
INDEX `building_id` (`building_id`),
INDEX `equipment_id` (`equipment_id`),
INDEX `state` (`state`),
INDEX `timestamp` (`timestamp`),
INDEX `measurement_type` (`measurement_type`),
INDEX `building_timestamp_type` (`building_id`, `timestamp`, `measurement_type`),
INDEX `building_type_state` (`building_id`, `measurement_type`, `state`),
INDEX `equipment_type_state` (`equipment_id`, `type`, `state`),
INDEX `equipment_type_state_stamp` (`equipment_id`, `measurement_type`, `state`, `timestamp`),
) COLLATE='utf8_unicode_ci' ENGINE=InnoDB;

现在我需要查询用户有权访问的某些类型的最后50个测量值。如果用户可以访问整个建筑物,则查询运行非常非常快。但是,如果用户只能访问单独的设备,则查询执行时间似乎与equipment_ids的数量呈线性增长。例如,我测试了在IN查询中只有2个equipment_ids,执行时间大约是10ms。在130台设备上,耗时2.5秒。我使用的查询如下所示:

SELECT *
FROM `measurements`
WHERE
    `measurements`.`state` IN ('high','low','alarm')
    AND `measurements`.`equipment_id` IN (
        SELECT `equipment_users`.`equipment_id`
        FROM `equipment_users`
        WHERE `equipment_users`.`user_id` = 1
    )
    AND (`measurements`.`measurement_type` IN ('temperature','luminosity','humidity'))
ORDER BY `measurements`.`timestamp` DESC
LIMIT 50

查询似乎偏向measurement_type索引,这使得它需要15秒,迫使它使用低至所列数字的equipment_type_state_stamp索引。不过,为什么执行时间会随着id的数量呈线性上升,我可以采取哪些措施来防止这种情况发生?

0 个答案:

没有答案