MySql select-groupBy非常沮丧?

MySql select-groupBy非常沮丧?,mysql,database,select,optimization,group-by,Mysql,Database,Select,Optimization,Group By,也许这个问题太宽了,但我真的需要这样: 我有一个表,有大约80k行和大约160列,我知道很多。不幸的是,我有一些常规选择,例如: SELECT hotelName , country , locality , destination , foodType , hotelStars , departureDateFrom , departureDateTo , MIN(price) FROM table WH

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

我有一个表,有大约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,此项目中的it用途仅用于“获取酒店详细信息”,groupBy保证酒店结果的唯一性

重点是-我必须在每一个select make groupBy+MIN+顺序中

所以主要的问题是每个请求的查询时间很长,大约250ms

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

当然,我使用的列最多。MIN、groupBy和order的列也被索引

在这种情况下,缓存是不可能的。 我无法影响数据结构。 我有其他的选择让它更快吗? 是否有助于减少列数?比如说60列

更新

表减少到65列 现在删除了所有索引,但groupBy的hotelId列上只有一个BTREE 对某些数据类型进行了优化,例如hotelId上的int11到int5 我们现在的响应时间是-25%,所以现在我们的响应时间是~190ms

有什么办法可以获得可接受的响应时间吗?我们的目标是~100毫秒,虽然仍然很多,但可以接受

从探查器:

从0.000101开始 正在检查权限0.000007 期初表0.000013 初始值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

您提供的数字听起来就像整个表都缓存在RAM中一样。因此,它可能不是I/O绑定的

无论如何,触摸56K行需要时间

最好的指数可能是这个复合指数col1、col2、col3。请调整行和列之间的术语

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

选择显然不依赖于GROUP BY列的列col2、col3、col6时,通常不适合按col5分组。您将获得这三列的随机值。好的,也许col5是唯一的,因此没有问题。如果可以,请提供真实姓名;这将帮助我们帮助你

我怀疑你在涉及的列中有很多种类,否则,我建议使用覆盖索引xcol1、col2、col3、col4、col5、col6——按该顺序排列的前3列,其余的按任何顺序排列


哦,主键是什么?这可能很重要。

我有点不清楚。您能显示预期结果和实际结果吗?修复数据库模型肯定会有帮助。表中的160列不仅很多,而且是不可接受的。让你的团队和你的经理一起思考并接受这一点,这一点必须得到解决。问题只会越来越严重。这是我的拙见。祝你好运。如果同一酒店ID的出发日期不同,则该日期无效。从该查询中期望对departureDate有用的东西是错误的。int11到int5是完全相同的。该查询的最佳索引是局部性。