MySql select-groupBy非常沮丧?
也许这个问题太宽了,但我真的需要这样: 我有一个表,有大约80k行和大约160列,我知道很多。不幸的是,我有一些常规选择,例如: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
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是完全相同的。该查询的最佳索引是局部性。