我的数据库存储在Google Cloud SQL(MySQL)中。该表有大约。 1100万行。 为什么简单选择计数这么慢?
我正在使用以下查询:
select count(*) from my_table;
响应时间例如:
数据库是否没有一些简单的计数器来计算行数?我想应该立即计算计数查询。
我可以加快速度吗?
注1:我想说它在一个月前运行良好,但我不确定。
注2:表大小为4GB,计算机为db-n1-standard-2(2vCPU,7.5 GB)
今天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"
}
答案 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
,并且有一个可以使用的密钥。该索引将使查询评估程序可以更快地返回计数。