我有一个独立的表格,我们通过每周的工作将其插入数据,然后在搜索模块中检索数据。
当我执行以下选择查询时,该表大约有4百万条记录(并且将变得更大),这需要很长时间(大约15秒)。我正在使用MySql DB。
SELECT
v.venueId,
(SELECT
MIN(totalPerPerson)
FROM
PricingArtifact pa
WHERE
pa.venueId = v.venueId
AND pa.mealId IN (SELECT
m.mealId
FROM
Meal m,
MealDay md
WHERE
m.mealId = md.mealId
AND m.mealDeletedAt IS NULL
AND md.mealDayDeletedAt IS NULL
AND m.venueId = v.venueId)) AS minPrice
FROM
Venue v
请注意
如果您仅在寻找场地和每人的最低总人数,则可以直接从pricepriceArtifact向下进行操作,而无需实际场地,因为pricepriceartifact具有场所ID ...,除非您也想要场所描述数据。
通过传递属性,如果V.VenueID = PA.VenueID,则可以将PA.VenueID连接到M.VenueID,而无需使用场所表。同样,PA.MealID可以直接连接到进餐表和MealDay表。
现在,您还提到了400万条记录的表。您的相关查询(查询perPerson / perVenue的min()值非常昂贵,因为您已经对第一张表中的每条记录进行子查询了。您是否真的需要回顾所有历史记录,或者是否有一些历史记录? DATE字段(例如,您仅关心过去30天的活动)?数据完成后,它真的会发生变化吗?也许保留汇总表作为分析定价的基础。
现在,为索引。我建议以下。
table index
PricingArtifact (venueID, mealID, totalPerPerson )
Meal (mealID, MealDeletedAt )
MealDay (mealID, MealDayDeletedAt )
SELECT
PA.venueID
MIN( PA.TotalPerPerson ) as VenueMinPerPerson
from
PricingArtifact PA
JOIN meal M
ON PA.MealID = M.MealID
AND M.MealDeletedAt IS NULL
JOIN MealDay MD
ON PA.MealID = MD.MealID
AND MD.MealDayDeletedAt Is NULL
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句