MySql select - groupBy非常沮丧?

时间:2017-06-06 13:08:32

标签: mysql database select optimization group-by

也许这个问题会太宽,但我真的需要这样:

我有约80k行和~160列的表(我知道很多)。不幸的是,我有常规选择,例如:

SELECT hotelName
     , country
     , locality
     , destination
     , foodType
     , hotelStars
     , departureDateFrom
     , departureDateTo
     , MIN(price) 
  FROM table 
 WHERE locality
   IN (
     '1', '2', '3'
   )
   AND visible IS NOT NULL
   AND departureDateFrom >= (?)
   AND departureDateTo <= (?)
   AND foodType = (?)
   AND hotelStars = (?)
   AND country
   IN (
     '1', '2', '3'
   )
 GROUP 
    BY hotelId 
 ORDER 
    BY price ASC

表中有旅游。因此,您可以拥有250条具有相同酒店名称,地点的记录......但具有不同的价格或离开日期。主键是id,在此示例中没有显示。 hotelId是来自其他系统的ID,此项目中的目的仅用于“获取酒店详细信息”和groupBy(保证结果的唯一酒店)

点是 - 我必须在每个选择中groupBy + MIN() + order

所以主要问题是每个请求的查询时间长〜250ms。

我的平均选择有10-15列。我认为这个问题是因为选择'触摸'~70%行,而后是groupBy,它将返回~200-400个结果。

我当然最常使用索引列。 (MIN(),groupBy和order的列也被编入索引)

  • 在这种情况下,缓存是不可能的。
  • 数据结构我无法影响。
  • 我还有其他选择可以加快速度吗?

有助于减少列数吗?比方说60列?

更新

  • 表格减少到65列
  • 现在,所有索引都被删除了,对于groupBy,hotelId列只有一个(BTREE)
  • 某些数据类型已经过优化,例如hotelId上的int(11)到int(5)

我们现在处于 -25%响应时间,所以现在我们处于~190ms。

有什么想法可以获得一些可接受的响应时间吗?我们的目标是~100ms(仍然很多但可以接受)。

来自个人资料:

起始0.000101
检查权限0.000007
开盘0.000013
init 0.000046
系统锁0.000011
优化0.000016
统计0.000096
准备0.000020
创建tmp表0.000029
对组0.000011进行排序 排序结果0.000006
执行0.000004
发送数据0.176949
创建排序索引0.000916
结束0.000009
查询结束0.000011
删除tmp表0.000602
查询结束0.000008
关闭表0.000012
释放物品0.000052
清理0.000033

1 个答案:

答案 0 :(得分:1)

您提供的数字听起来像整个表一样缓存在RAM中。所以,它可能不受I / O约束。

无论如何,触及56K行都需要时间。

最佳索引可能是此复合INDEX(col1, col2, col3)。 (请在“行”和“列”之间调整术语。)

GROUP BY col5 ORDER BY col6必须创建两个临时表,并对每个临时表进行排序。

GROUP BY col5 SELECTing列(col2,col3,col6)(显然)不依赖于GROUP BY列,通常是不合适的。您将获得这三列的随机值。好的,也许col5UNIQUE,因此没有问题。 (如果可以,请提供真实姓名;这将有助于我们为您提供帮助。)

我怀疑你所涉及的栏目有很多种,否则,我会建议“覆盖”INDEX(col1, col2, col3, col4, col5, col6) - 该顺序中的前3列,其余按任何顺序排列。

哦,PRIMARY KEY是什么?这可能很重要。