【问题标题】:Slow query in MySQL with joinsMySQL 中带连接的慢查询
【发布时间】: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


    【解决方案1】:

    ChapterGroupBook 看起来像一个多对多映射表。如果是这样,为什么所有列都可以为空?让他们(以及其他任何地方)NOT NULL 在适当的地方。

    由于上述原因,该表没有PRIMARY KEY。这对 InnoDB 不利。另请参阅我的 many:many tips

    OR 是性能杀手。在(Bk.ID=551 OR Bk.ParentID=551) 中有什么方法可以避免它吗?如有必要,我们在派生表中添加UNION

    FROM ( ( SELECT id FROM Book WHERE id = 551 )
           UNION ALL
           ( SELECT id FROM Book WHERE parent_id = 551 ) )
    JOIN ...
    

    (使用了“索引合并”,但可能会更慢。)

    请重新格式化EXPLAIN,以便我可以清楚地看到Rows 列。

    【讨论】:

      猜你喜欢
      • 2022-10-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-02-22
      • 2015-03-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多