在我的应用程序中,我的模块使用下表
从下表中我正在检索数据
SELECT PA.REGISTRATION_NO,PA.APP_ID,PA.NO_OF_ATTEMPTS,CM.CATEGORY_NAME,
DM.SITE_DIMENSION,PR.BDA_NO,AN.NOTIFY_ID
FROM **PUBLIC_APPLICATION PA,CATEGORY_MASTER CM,NOTIFICATION_SITE_DETAIL NSD,DIMENSION_MASTER DM, PUBLIC_REGISTRATION PR,ALLOTMENT_NOTIFICATION AN**
WHERE **CM.CATEGORY_ID = PA.CATEGORY_ID AND
NSD.NOTIFY_SITE_ID = PR.NOTIFY_SITE_ID AND
DM.DIMENSION_ID = NSD.DIMENSION_ID AND
PR.REGISTRATION_NO = PA.REGISTRATION_NO AND
AN.NOTIFICATION_NO = PA.NOTIFICATION_NO AND
PR.NOTIFY_SITE_ID = PA.NOTIFY_SITE_ID AND NSD.NOTIFY_ID = AN.NOTIFY_ID AND
PA.NOTIFICATION_NO = ?** LIMIT ?, ?
PUBLIC_APPLICATION& PUBLIC_REGISTRATION拥有大量数据,近百万条记录和其他表格大约有5000条记录。
如果我执行上面的查询需要超过30分钟才能得到结果,任何人都可以建议我编写有效的查询以在最短的时间内得到结果。
忘了指定,我正在使用mysql数据库。
答案 0 :(得分:4)
通过使用“STRAIGHT_JOIN”,您可以告诉优化器按照您的说法执行此操作。 我将Notification#作为第一个WHERE子句移动,因此首先处理它以限制您的设置。然后,我将连接设置为其他表。我之前有过这样的问题,在查询15,000多条记录的数据以加入15个以上的表时,需要20多个小时。通过在我已经形成的查询中添加“STRAIGHT_JOIN”,大约花了2个小时......再次获得了15,000多条记录,并加入了超过15个表格,用于描述儿童描述细节。
SELECT STRAIGHT_JOIN
PA.REGISTRATION_NO,
PA.APP_ID,
PA.NO_OF_ATTEMPTS,
CM.CATEGORY_NAME,
DM.SITE_DIMENSION,
PR.BDA_NO,
AN.NOTIFY_ID
FROM
PUBLIC_APPLICATION PA,
CATEGORY_MASTER CM,
NOTIFICATION_SITE_DETAIL NSD,
DIMENSION_MASTER DM,
PUBLIC_REGISTRATION PR,
ALLOTMENT_NOTIFICATION AN
WHERE
PA.NOTIFICATION_NO = ?
AND PA.CATEGORY_ID = CM.CATEGORY_ID
AND PA.REGISTRATION_NO = PR.REGISTRATION_NO
AND PA.NOTIFICATION_NO = AN.NOTIFICATION_NO
AND PA.NOTIFY_SITE_ID = PR.NOTIFY_SITE_ID
AND PR.NOTIFY_SITE_ID = NSD.NOTIFY_SITE_ID
AND NSD.DIMENSION_ID = DM.DIMENSION_ID
AND NSD.NOTIFY_ID = AN.NOTIFY_ID
LIMIT
?, ?