我有一个查询要在MySQL的表中执行。 但是,Google Cloud SQL返回结果非常缓慢:
SELECT count(*) from navegacao
==>花4分钟计算40,000,000行
这不是很长时间吗?如何通过修改我的请求或表格结构来改善计算时间?
当我提高MySQL数据库的性能时,这个时间不会改变,即使使用更大的机器,例如“具有16个虚拟CPU和60 GB内存的标准16 CPU机器类型。”
一些似乎对相关主题感兴趣的请求:
显示来自navegacao的指数让我回复:
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
来自navegacao请求的解释选择计数(*):
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
答案 0 :(得分:1)
对于Count(*)
,您很难通过使用此命令来优化查询,它只是计算表中的每一行而不使用任何索引,基本上它正在进行表扫描。您提到您已使用性能更佳的系统进行切换,在运行相同查询时是否更改了连接?
对于最后一步,您已经拥有productid
的非聚集索引,这将在使用该列获取结果的查询时为您提供更好的性能。由于您为datacalendario
指定了另一个条件,因此您可以为该列创建另一个非聚集索引,也可以为productid
和datacalendario
创建关于该特定查询性能改进的复合索引。 / p>