什麼是最佳實踐,什麼能提供最佳性能?在一個API請求中有多個連接的單個查詢,或者在單獨的API請求中連接了幾個查詢?
我現在有很多LEFT JOIN
個查詢獲取一個user
和他的所有數據,喜歡的朋友,朋友的請求,等:
SELECT
`user`.`id` AS `user_id`,
`user`.`name` AS `user_name`,
`manager`.`id` AS `manager_id`,
`competition`.`id` AS `manager_competition_id`,
`competition`.`name` AS `manager_competition_name`,
`competition`.`week` AS `manager_competition_week`,
`country`.`id` AS `manager_competition_country_id`,
`country`.`name` AS `manager_competition_country_name`,
`club_template`.`id` AS `manager_club_template_id`,
`club_template`.`name` AS `manager_club_template_name`,
`club`.`id` AS `manager_club_id`,
`club`.`name` AS `manager_club_name`,
`club`.`ready` AS `manager_club_ready`,
`friend`.`friend_id` AS `friend_id`,
`friend_user`.`name` AS `friend_name`
FROM
`users` AS `user`
LEFT JOIN
`managers` AS `manager`
ON
`manager`.`user_id` = `user`.`id`
LEFT JOIN
`competitions` AS `competition`
ON
`competition`.`id` = `manager`.`competition_id`
LEFT JOIN
`countries` AS `country`
ON
`country`.`id` = `competition`.`country_id`
LEFT JOIN
`club_templates` AS `club_template`
ON
`club_template`.`id` = `manager`.`club_template_id`
LEFT JOIN
`clubs` AS `club`
ON
`club`.`id` = `manager`.`club_id`
LEFT JOIN
`friends` AS `friend`
ON
`friend`.`user_id` = `user`.`id`
LEFT JOIN
`users` AS `friend_user`
ON
`friend_user`.`id` = `friend`.`friend_id`
WHERE
`user`.`id` = 1
正如你可以看到,這是一個非常大的查詢。我這背後的理由是,這是更好地只有一個查詢可以在一個API請求來完成,像這樣...
/api/users/1
...與幾個疑問,各自在自己的API請求,像這...
/api/users/1
/api/users/1/friends
/api/users/1/friend_requests
/api/users/1/managers
但現在我很擔心,既然它已經成爲這實際上會損害性能更比它在單獨的API請求分割如此龐大的查詢。
什麼會縮放更好?
更新
我已經改變了查詢到完整的查詢。這不是最終的查詢;我打算添加更多的連接(或不是,取決於答案)。
每張桌子上有PRIMARY KEY
,id
。所有關聯列(competition_id
,club_id
等)都有一個常規的INDEX
。數據庫引擎是InnoDB。
如果您可以提供數據庫結構和密鑰背後的一些信息以及完整查詢 – 2012-02-20 15:56:30
完成,將會有所幫助。讓我知道你是否需要更多 – Rits 2012-02-20 16:08:34