0

下面是表结构。MySql 表包含 1100 万条数据。所有数据只能在一天内插入到表中。我尝试执行以下查询,它需要 5-7 分钟才能完成。我已经根据查询创建了索引,甚至需要 3-5 分钟才能完成。正在使用索引。

我应该怎么做才能提高查询性能?有什么建议么 ?

CREATE TABLE `service_collection_data` (
  `service_name` varchar(512) NOT NULL,
  `device_id` bigint(20) NOT NULL,
  `dataset_name` varchar(1024) NOT NULL,
  `dataset_title` varchar(1024) NOT NULL,
  `dataset_type` varchar(32) NOT NULL,
  `dataset_command` varchar(4000) DEFAULT NULL,
  `tag_name` varchar(4000) DEFAULT NULL,
  `command_status` varchar(256) NOT NULL,
  `command_result` longtext,
  `command_error` longtext,
  `command_context` longtext,
  `collection_time` timestamp NOT NULL 
     DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  KEY `device_id` (`device_id`),
  KEY `service_tag_command_index` (`service_name`(300),`tag_name`(200),
  `command_status`(200),`device_id`),
  CONSTRAINT `service_collection_data_ibfk_1` 
      FOREIGN KEY (`device_id`) 
      REFERENCES `nodes` (`id`) ON DELETE CASCADE
)
ENGINE=InnoDB DEFAULT CHARSET=latin1

下面是执行查询

SELECT COUNT(DISTINCT device_id) 
FROM service_collection_data 
WHERE service_name='NOS'  
   AND tag_name='Config' 
   AND command_status = 'Successful'
4

1 回答 1

0

作为调试场景,速度是多少:

1) 从 service_collection_data 中选择 COUNT(device_id)

2) 从 service_collection_data 中选择 COUNT(DISTINCT device_id)

3) SELECT COUNT(*) FROM service_collection_data WHERE service_name='NOS'
AND tag_name='Config' AND command_status = 'Successful'

4) SELECT COUNT(DISTINCT device_id) FROM (SELECT service_name, tag_name, command_status, device_id FROM service_collection_data GROUP BY service_name, tag_name, command_status, device_id WHERE service_name='NOS'
AND tag_name='Config' AND command_status = 'Successful')

其他:

  • 可以将 device_id 指定为主键(从而保证不同的值)吗?
  • service_name、tag_name 和 command_status 可以改成整数外键吗?
于 2013-06-15T15:07:43.040 回答