簡體   English   中英

MySQL中使用聯接的查詢緩慢

[英]Slow query in MySQL with joins

我的查詢運行太慢,但無法弄清楚其背后的原因或解決方案。 該查詢最初大約需要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
會話367334
AnswerTextMarker 9696
課題組18793
ChapterGroupItemInChapterGroup 42360
第2297章
第378章

ChapterGroupBook看起來像一個多對多映射表。 如果是這樣,為什么所有列都可以為空? 使它們(以及其他任何其他地方)在適當的地方NOT NULL

由於上述原因,該表沒有PRIMARY KEY 這對InnoDB不利。 另請參閱我的許多技巧

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列。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM