我有一个查询要在MySQL中的表中执行。但是,Google Cloud SQL返回结果的速度非常慢:
SELECT count(*) from navegacao
==> 需要 4 分钟来计算 40,000,000 行
这不是很长的时间吗?如何通过修改请求或表的结构来缩短计算时间?
当我提高 MySQL 数据库的性能时,这个时间不会改变,即使对于更大的机器,如"具有 16 个虚拟 CPU 和 60 GB 内存的标准 16 CPU 机器类型"。
一些似乎对相关主题感兴趣的请求:
显示索引从纳维加索返回我:
TABLE_NAME NON_UNIQUE INDEX_NAME SEQ_IN_INDEX COLUMN_NAME COLLATION CARDINALITY SUB_PART PACKED NULL INDEX_TYPE COMMENT INDEX_COMMENT
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
navegacao 0 PRIMARY 1 navegacaobk A 35037900 <null> <null> BTREE
navegacao 1 memberid 1 memberid A 7007580 <null> <null> YES BTREE
navegacao 1 ofertaid 1 ofertaid A 547467 <null> <null> YES BTREE
navegacao 1 productid 1 productid A 200216 <null> <null> YES BTREE
表的架构如下:
1 campaign VARCHAR 255
2 datacalendario DATE 10
3 medium VARCHAR 255
4 memberid VARCHAR 255
5 navegacaobk VARCHAR 255
6 productlistposition VARCHAR 255
7 productlistname VARCHAR 255
8 skunavigation VARCHAR 255
9 ofertaid VARCHAR 255
10 productid VARCHAR 255
11 source VARCHAR 255
12 productaddstocart DECIMAL 12
13 productcheckouts DECIMAL 12
14 productdetailview DECIMAL 12
15 productlistview DECIMAL 12
16 productuniquepurchases DECIMAL 12
17 cicheckin DECIMAL 12
18 cicheckout DECIMAL 12
19 cireservar DECIMAL 12
20 productlistclics DECIMAL 12
21 totalamountcireservar DECIMAL 12
22 productrevenue DECIMAL 12
来自纳维加索请求的解释选择计数(*(:
id select_type table type possible_keys key key_len ref rows Extra
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
1 SIMPLE navegacao index <null> memberid 768 <null> 35037900 Using index
最后,我的最终请求应该是这样的
select memberid,max(datacalendario) as lastvisdate from navegacao where productid in (591,64,8985,774,9) and datacalendario > curdate()-100 group by memberid
对于Count(*)
,您几乎无法使用此命令优化查询,它只是计算表中的每一行而不使用任何索引,基本上它是在执行表扫描。您提到您使用性能更好的系统进行了切换,您是否在运行相同的查询时更改了连接?
对于最后一步,您已经拥有了 productid
的非聚集索引,当查询利用该列获取结果时,这将为您提供更好的性能。由于您为 datacalendario
指定了另一个条件,因此您可以为该列创建另一个非聚集索引,也可以为有关该特定查询性能改进的productid
和datacalendario
创建复合索引。