mysql - 优化聚合查询

标签 mysql

以下是我的聚合查询,需要 1.1 秒。该查询有多个联接。哪些列的索引将优化查询。

         EXPLAIN SELECT straight_join
          aggsm.tdm_id AS topid,              
          sum(aggsm.m_count) AS mencnt ,
          sum(aggsm.ps_count) AS pscnt,
          sum(aggsm.ns_count) AS ngscnt,
          topdm.topic_name AS topname
         FROM AGG_MENTION AS aggsm 
         JOIN TOPICDM AS topdm  ON aggsm.topicdm_id = topdm.topicdm_id
         JOIN LOCATIONDM AS locdm ON aggsm.locationdm_id = locdm.locationdm_id
         JOIN CITY AS citydm ON locdm.city_id = citydm.city_id
         JOIN STATE AS statedm ON citydm.state_id = statedm.state_id
         WHERE aggsm.cdm_id = 11
         AND aggsm.ei_type IN (1,2,3,4)
         AND aggsm.datedm_id BETWEEN 20130101 AND 20130522   
         AND statedm.country_id IN (1,2,3,4) 
         AND topdm.topic_group_id IN (1,2,3,4,5,6,7)    
         GROUP BY aggsm.topicdm_id
         -- ORDER BY aggsm.topicdm_id DESC,sum(aggsm.m_count) DESC
         LIMIT 0,200000

以下是解释输出:

   1    SIMPLE  aggsm   ref PRIMARY,datedm_id_UNIQUE,agg_sm_locdm_fk_idx,agg_sm_comdm_fk_idx,agg_sm_topdm_fk_idx,agg_sm_datedm_fk_idx,agg_em_indtype_fk_idx,comp_top_dt,l_idx   comp_top_dt 8   const   202129  Using where; Using index
   1    SIMPLE  topdm   eq_ref  PRIMARY,topicdm_id_UNIQUE,topdm_grp_id_idx,id_idx   PRIMARY 8   opinionleaders.aggsm.topicdm_id 1   Using where
   1    SIMPLE  locdm   eq_ref  PRIMARY,city_id_UNIQUE,locationdm_id_UNIQUE,loc_city_fk_idx,id_idx  PRIMARY 8   opinionleaders.aggsm.locationdm_id  1   
   1    SIMPLE  citydm  eq_ref  PRIMARY,city_id_UNIQUE,city_state_fk_idx,id_idx PRIMARY 8   opinionleaders.locdm.city_id    1   
   1    SIMPLE  statedm eq_ref  PRIMARY,state_id_UNIQUE,state_country_fk_idx,id_idx PRIMARY 8   opinionleaders.citydm.state_id  1   Using where

取消注释 order by 子句将导致 aggsm 表使用“using tempor,using filesort”

我们如何优化查询或定义索引

最佳答案

1) LIMIT 0,200000 绝对不是一个好的解决方案,我几乎看不到需要如此大量数据的应用程序,将其分成 block

2) 在 ORDER BY 子句中,您指定 sum(aggsm.m_count) - 这是一个聚合函数,尝试将其寻址为mencnt(因此ORDER BY aggsm.topicdm_id DESC,mencnt DESC),不确定SQL Server是否按照您的意愿理解它

关于mysql - 优化聚合查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16777958/

相关文章:

c# - MySQL 和事务不回滚

php - 在 mysqli_multiple_query() 函数之后获取数组

mysql - MySQL 中 IF 和 THEN 的正确语法是什么?

mysql - 两个 MySQL 表的复杂连接

mysql - 在 MySQL 中计算频率

javascript - 使用mysql数据创建条形图

mysql - 更新表嵌套查询(使用函数)

php - Mysql 查询需要帮助以使用 Group By 匹配列值开头的前 10 个字符并将它们分组在相同的名称下

php - 通过在单个表中使用 count 来组合多个 mysql_num_rows 查询

php - 使用 Post 通过 PHP 从 Python 访问 SQL 数据库