【发布时间】:2019-08-24 15:22:44
【问题描述】:
我有一个查询运行速度太慢,但我无法找出其背后的原因或解决方案。该查询最初运行大约需要 22 秒,但随后我尝试删除表 Book 中的外键,该外键是同一个表中 ParentID 的 FK。删除后,查询大约需要 1 秒。这当然很好,但应该有更多改进的空间,要么重新构造查询本身,要么使用不同的索引。
谁能给点建议?为什么 Book.ParentID 的外键会导致查询时间如此增加?这里最好的方法是什么,尝试重写查询或查看索引?
除了将外键删除到Book.ParentID 之外,我已经尝试在选定的表和一些连接上使用use index,但没有真正的运气。
这是一个小提琴:http://sqlfiddle.com/#!9/7f7bbb/9
但是,小提琴中的解释计划与我在生产中得到的不同。这是来自生产的解释计划(带有 Book.ParentID 的外键):
'1','SIMPLE','Bk',NULL,'index_merge','PRIMARY,fk_CategoryParent_ID_idx','PRIMARY,fk_CategoryParent_ID_idx','8,9',NULL,'2','100.00','Using union(PRIMARY,fk_CategoryParent_ID_idx); Using where; Using temporary; Using filesort'
'1','SIMPLE','CGB2',NULL,'ref','uq_ChapterGroup_Category,book_chaptergroup_unique_row_constraint,fk_Category_ChapterGroup_ID,ix_chapterGroupBook_chapterGroupID','book_chaptergroup_unique_row_constraint','9','Hypo.Bk.ID','8','100.00','Using where'
'1','SIMPLE','CCG2',NULL,'ref','uq_ChapterID_ChapterGroupItemInChapterGroup,uq_ExamID_ChapterGroupItemInChapterGroup,fk_ChapterGroup_Chapter_ID,ix_chapterChapterGroup_chapterID','fk_ChapterGroup_Chapter_ID','8','Hypo.CGB2.ChapterGroupID','2','100.00','Using where'
'1','SIMPLE','ATM',NULL,'ref','PRIMARY,fk_Chapter_AnswerTextMarker_ID,fk_QuestionGroup_AnswerTextMarker_ID','fk_Chapter_AnswerTextMarker_ID','8','Hypo.CCG2.ChapterID','5','100.00','Using where'
'1','SIMPLE','QG',NULL,'eq_ref','PRIMARY','PRIMARY','8','Hypo.ATM.QuestionGroupID','1','100.00','Using index'
'1','SIMPLE','AQS',NULL,'ref','PRIMARY,fk_AQSession_AnswerTextMarker_ID,ix_answerQuestionSession_questionSessionID','fk_AQSession_AnswerTextMarker_ID','8','Hypo.ATM.ID','313','100.00',NULL
'1','SIMPLE','QS',NULL,'eq_ref','PRIMARY,fk_QSession_User_ID,ix_QuestionSession_userId_type_sessionDate','PRIMARY','8','Hypo.AQS.QuestionSessionID','1','5.00','Using where'
我的环境中的行数:
回答问题会话 3992125
QuestionSession 367334
AnswerTextMarker 9696
问题组 18793
ChapterGroupItemInChapterGroup 42360
ChapterGroupBook 2297
书 378
【问题讨论】:
标签: mysql performance join foreign-keys