我正在使用Mysql 5.7 我有1 900 516行的表。 我的查询在按索引的列上按组执行,但执行仍需要时间。下面是我的查询,执行计划和表模式。
select `type`,count(`type`)
from templog
group by `type` ;
查询说明格式
{
"query_block": {
"select_id": 1,
"cost_info": {
"query_cost": "376984.80"
},
"grouping_operation": {
"using_filesort": false,
"table": {
"table_name": "templog",
"access_type": "index",
"possible_keys": [
"templog_type_idx"
],
"key": "templog_type_idx",
"used_key_parts": [
"type"
],
"key_length": "1",
"rows_examined_per_scan": 1856244,
"rows_produced_per_join": 1856244,
"filtered": "100.00",
"using_index": true,
"cost_info": {
"read_cost": "5736.00",
"eval_cost": "371248.80",
"prefix_cost": "376984.80",
"data_read_per_join": "84M"
},
"used_columns": [
"templogid",
"type"
]
}
}
}
}
表架构
CREATE TABLE `templog` (
`templogid` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
`userid` bigint(12) unsigned NOT NULL,
`type` tinyint(3) NOT NULL DEFAULT '0',
`location` json DEFAULT NULL,
`ip` int(4) unsigned DEFAULT NULL,
`createdat` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
`status` tinyint(3) unsigned NOT NULL DEFAULT '1',
PRIMARY KEY (`templogid`),
KEY `templog_type_idx` (`type`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=1900516 DEFAULT CHARSET=utf8;
如何优化此查询?
答案 0 :(得分:1)
它必须读取type
索引中的所有1.9M行。这需要一些时间。 EXPLAIN FORMAT=JSON
确认通过给定的模式和查询正在尽其所能。
如果这是写后从未使用UPDATEd
或DELETEd
的“日志”,则可能可以使用“数据仓库”技巧。
通过构建和增量维护摘要表,可以将等效查询速度提高10倍。更多discussion。