爲了本文的目的,我將問題簡化爲最純粹的形式。 我有3個表:遊戲,games_tags和games_tags_map緩慢的MYSQL查詢,需要幫助理解索引
這就是我做,如果我想獲得的標籤表中每場比賽:
SELECT `games_tags_map`.`game_id` as 'game_id', GROUP_CONCAT(`games_tags_map`.`tag_id`) as 'tags'
FROM `games_tags_map`
LEFT JOIN `games_tags` on `games_tags`.id = `games_tags_map`.`tag_id`
GROUP BY `games_tags_map`.game_id
這需要〜1ms的
SELECT `games`.`id` AS 'id' from `games`
這需要< 1ms。
然而,當我嘗試加入這兩種:
SELECT `games`.`id` AS 'id',
t.`tags` as `tags`
FROM `games`
LEFT JOIN (
SELECT `games_tags_map`.`game_id` as 'game_id', GROUP_CONCAT(`games_tags_map`.`tag_id`) as 'tags'
FROM `games_tags_map`
LEFT JOIN `games_tags` on `games_tags`.id = `games_tags_map`.`tag_id`
GROUP BY `games_tags_map`.game_id
) t ON t.`game_id`=`games`.`id`
這需要〜100ms的
然而,當我做了等效查詢:
SELECT `games`.`id` AS 'id',
GROUP_CONCAT(DISTINCT `games_tags`.`tag`) AS 'tags'
FROM `games`
LEFT JOIN `games_tags_map` ON `games`.`id` = `games_tags_map`.`game_id`
LEFT JOIN `games_tags` ON `games_tags`.`id` = `games_tags_map`.`tag_id`
WHERE `games`.`active`=1
GROUP BY `games`.`id`
它耗時2ms。 .. 但是,當我需要通過除主列(id)以外的任何東西來訂購它時,它需要約80ms
只是爲了澄清,這是我的實際數據庫的一個非常簡化的版本,它正在經歷更長的加載時間並導致我的網站出現問題,但問題在於這些查詢。
我的數據庫的設置方式顯然存在一個缺陷,因爲這樣的加載時間差別很大。我嘗試添加更多索引,但它沒有幫助。 桌子上「遊戲」我的主索引「身份證」 在表「games_authors_map」由「game_id」和「AUTHOR_ID」
的,我知道有問題,但我不能修復它的主要指標我不明白爲什麼。
請幫忙。
由於其他原因,我正在考慮這條路線,但問題仍然存在,爲什麼2個連接查詢的速度明顯比他們應該慢?我確定必須有辦法通過篡改表結構來優化它們。 – hedgehog90
@ hedgehog90,請參閱修訂過帳以澄清您的查詢並涵蓋索引。 – DRapp
感謝DRapp,非常有幫助的帖子。我最終做的是在遊戲桌上創建幾個新列,比如'_tags'(我把一個下劃線前綴提醒我這是一個自動化領域),每次我給gt或gt添加一個新標籤時,它也是使用所有標籤文字設置此列。我避免了許多加入和分組,並且它在性能上造成了巨大的差異。現在我只需要在使用特定標籤過濾遊戲時或者在排列遊戲之間的相似性(使用它們的標籤和其他數據)時參考gt和gtm表格, – hedgehog90