也许这个问题会太宽,但我真的需要这样:
我有约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列?
更新
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
答案 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
列,通常是不合适的。您将获得这三列的随机值。好的,也许col5
是UNIQUE
,因此没有问题。 (如果可以,请提供真实姓名;这将有助于我们为您提供帮助。)
我怀疑你所涉及的栏目有很多种,否则,我会建议“覆盖”INDEX(col1, col2, col3, col4, col5, col6)
- 该顺序中的前3列,其余按任何顺序排列。
哦,PRIMARY KEY
是什么?这可能很重要。