Mysql Group по производительности запросов очень медленно - PullRequest
0 голосов
/ 17 марта 2019

Я использую 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 Ответ

1 голос
/ 17 марта 2019

Он должен прочитать все 1,9M строк в индексе type. Это займет некоторое время. EXPLAIN FORMAT=JSON подтверждает, что он делает все возможное со схемой и запросом, как указано.

Если это «журнал», который никогда не записывается UPDATEd или DELETEd после записи, то возможно использовать приемы хранилища данных.

Создавая и постепенно поддерживая сводную таблицу, вы могли бы ускорить эквивалентный запрос, возможно, в 10 раз. Подробнее обсуждение .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...