简单的SELECT COUNT(*)在Google CloudSQL(MySQL)上非常慢

时间:2017-03-27 15:13:23

标签: mysql google-cloud-sql

我有一个查询要在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

1 个答案:

答案 0 :(得分:1)

对于Count(*),您很难通过使用此命令来优化查询,它只是计算表中的每一行而不使用任何索引,基本上它正在进行表扫描。您提到您已使用性能更佳的系统进行切换,在运行相同查询时是否更改了连接?

对于最后一步,您已经拥有productid的非聚集索引,这将在使用该列获取结果的查询时为您提供更好的性能。由于您为datacalendario指定了另一个条件,因此您可以为该列创建另一个非聚集索引,也可以为productiddatacalendario创建关于该特定查询性能改进的复合索引。 / p>