Mysql Group by查询性能非常慢

时间:2019-03-17 11:46:01

标签: mysql performance indexing group-by innodb

我正在使用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;

如何优化此查询?

1 个答案:

答案 0 :(得分:1)

它必须读取type索引中的所有1.9M行。这需要一些时间。 EXPLAIN FORMAT=JSON确认通过给定的模式和查询正在尽其所能。

如果这是写后从未使用UPDATEdDELETEd的“日志”,则可能可以使用“数据仓库”技巧。

通过构建和增量维护摘要表,可以将等效查询速度提高10倍。更多discussion