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



我有一个查询要在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 指定了另一个条件,因此您可以为该列创建另一个非聚集索引,也可以为有关该特定查询性能改进的productiddatacalendario创建复合索引。

相关内容

  • 没有找到相关文章

最新更新