为什么COUNT在Google Cloud SQL中有时会这么慢?

时间:2019-08-12 12:53:24

标签: mysql google-cloud-platform google-cloud-sql

我的数据库存储在Google Cloud SQL(MySQL)中。该表有大约。 1100万行。 为什么简单选择计数这么慢?

我正在使用以下查询:

select count(*) from my_table;

响应时间例如:

  • 超过2分钟
  • 29s
  • 3秒(是否使用了某些缓存?)

数据库是否没有一些简单的计数器来计算行数?我想应该立即计算计数查询。

我可以加快速度吗?

注1:我想说它在一个月前运行良好,但我不确定。

注2:表大小为4GB,计算机为db-n1-standard-2(2vCPU,7.5 GB)

更新8月14日

今天COUNT个很快。最坏的时间是4秒。明天的延迟是否是由于某些Google平台问题引起的?我可以直接SSH到SQL机器来监视它的资源并交换文件吗?

我尝试过汤米的提示,还有另外一件奇怪的事情。说明显示许多表列为NULL。可能是由不同的服务器版本引起的吗?我是Server version: 5.7.14-google-log (Google)

我用过:

explain select count(1) from my_table;

结果是:

| id | select_type | table | partitions | type | possible_keys | key  | key_len | ref  | rows | filtered | Extra                        |
|  1 | SIMPLE      | NULL  | NULL       | NULL | NULL          | NULL | NULL    | NULL | NULL |     NULL | Select tables optimized away |

在JSON中:

{
  "query_block": {
    "select_id": 1,
    "message": "Select tables optimized away"
  }

1 个答案:

答案 0 :(得分:1)

默认情况下,通常针对特定类型的使用模式对数据库进行优化。因此,进行任何额外的工作都会对性能产生负面影响。即使保持简单计数也没有完成,因为它会严重影响每秒可以执行多少操作。

这是您可以尝试的实验(MySQL 5.7)。首先创建一个没有索引的简单表。

create table A (
  B int
);

explain select count(1) from A;

id  select_type table   partitions  type    possible_keys   key key_len ref rows    filtered    Extra
1   SIMPLE  A   NULL    ALL NULL    NULL    NULL    NULL    1   100.00  NULL

还有json:

{
    "data":
    [
        {
            "id": 1,
            "select_type": "SIMPLE",
            "table": "A",
            "partitions": null,
            "type": "ALL",
            "possible_keys": null,
            "key": null,
            "key_len": null,
            "ref": null,
            "rows": 1,
            "filtered": 100,
            "Extra": null
        }
    ]
}

Explain输出的重要部分是"type": "ALL"部分,它表示要获得调用,数据库必须检索所有行,即表扫描。这就是选择计数缓慢的原因。

通过在表上创建索引,可以告诉数据库计数对您很重要。每次插入后,数据库必须更新该表的索引。

因此,我们添加一个索引:alter table A add index idx_A(B);。并重新运行explain语句:

id  select_type table   partitions  type    possible_keys   key key_len ref rows    filtered    Extra
1   SIMPLE  A   NULL    index   NULL    idx_A   5   NULL    1   100.00  Using index

再次以json格式:

{
    "data":
    [
        {
            "id": 1,
            "select_type": "SIMPLE",
            "table": "A",
            "partitions": null,
            "type": "index",
            "possible_keys": null,
            "key": "idx_A",
            "key_len": "5",
            "ref": null,
            "rows": 1,
            "filtered": 100,
            "Extra": "Using index"
        }
    ]
}

这一次,请注意type,它是index,并且有一个可以使用的密钥。该索引将使查询评估程序可以更快地返回计数。