代码之家  ›  专栏  ›  技术社区  ›  CRISTIAN ROMERO MATESANZ

Mysql内部连接计数查询太慢

  •  1
  • CRISTIAN ROMERO MATESANZ  · 技术社区  · 8 年前

    我尝试用一个简单的内部连接语句来获取count查询。我已经为所有属性创建了索引。查询非常慢:(12秒)。我在表1和表2中有400万条记录。我的问题是:

     select count(*)
     from (`mymodb`.`Table1`
         join `mymodb`.`Table2` on ((`mymodb`.`Table2`.`id` =`mymodb`.`Table1`.`id_table1`)))
     where (`mymodb`.`Table2`.`merchant_id` = 16444)
       and Table1.created_at >= '2017-12-03 16:00:19' AND  Table1.created_at <='2018-05-03 16:00:19';
    

    这是desc query命令(参见5.524.164记录):

    1   SIMPLE  Table1      ALL Table12_index,Table16_index             5524164 21.38   Using where
    1   SIMPLE  Table2      eq_ref  PRIMARY,idx_Table2_id-uniq,Table26_index    PRIMARY 8   mymodb.Table1.id_table1 1   50  Using where
    

    使用两个表的内部联接(表1---表2)获取count查询的最佳方法是什么。12秒对于我的进程来说是非常糟糕的时间。

    2 回复  |  直到 8 年前
        1
  •  2
  •   cherrysoft    8 年前

    首先,我建议使用别名和其他语法简化查询,以便更好地阅读查询。

        2
  •  -1
  •   Piyush Bansal    8 年前

    您正试图用“join”关键字连接表,这意味着正在应用交叉连接。交叉连接通常比内部连接慢。

    尝试此查询:

    select count(*)
     from (`mymodb`.`Table1`
         inner join `mymodb`.`Table2` on ((`mymodb`.`Table2`.`id` =`mymodb`.`Table1`.`id_table1`)))
     ON (`mymodb`.`Table2`.`merchant_id` = 16685)
       and Table1.created_at >= '2017-12-03 16:00:19' AND  Table1.created_at <='2018-05-03 16:00:19';
    

    希望有用。