簡體   English   中英

許多(許多)SQL JOIN與多個查詢

[英]Many (many) SQL JOINs vs Multiple queries

我想是在這里問一個問題,你們中許多人已經問過自己了。 我正在創建一個PHP網站,直到我決定用一些測試數據(實際數據,當應用程序開始用於實際數據時,實際數據將變得更大)填充所有數據庫之后,一切都運行順利。 大多數事情仍然可以正常運行,但是其中一項特別(非常重要)的功能開始具有三到四秒的執行時間,而這些時間大部分都花在了MySQL服務器上。

這是一筆交易:我正在為一所學校構建一個應用程序,它需要掌握每一天,每個人,每個房間,每個班級的所有時間表和課程。 數據庫的結構已經完成,索引已創建,等等。問題是,由於所有這些數據都是關系數據(並且可以分布在許多表中),因此一次查詢就可以獲取所有數據:

SELECT field1, field2, etc
FROM schedules AS su
LEFT JOIN schedules_lessons AS sul
    ON sul.ID_SCHEDULE = su.ID
LEFT JOIN schedules_lessons_teachers AS sult
    ON sult.ID_LESSON = sul.ID
LEFT JOIN users AS u
    ON u.ID = sult.ID_TEACHER
LEFT JOIN schedules_periods AS sup
    ON sup.ID_SCHEDULE = su.ID
LEFT JOIN schedules_periods AS sulp
    ON sulp.ID_SCHEDULE = sul.ID_SCHEDULE AND sulp.period = sul.period
LEFT JOIN schools AS s
    ON s.ID = su.ID_SCHOOL
LEFT JOIN schools_buildings AS sb
    ON sb.ID_SCHOOL = s.ID
LEFT JOIN schools_rooms AS sr
    ON sr.ID = sul.ID_ROOM
LEFT JOIN schools_classes AS sc
    ON sc.ID = sul.ID_CLASS

是的,我知道很多。 我的問題是:如何在連接數與查詢數之間取得最佳平衡? 因為我覺得這真的可以改善,但是我不確定如何實現。

大多數表的記錄數少於200,只有教訓表可以有更多記錄。 最小值約為5k,最大值可以約為30k,甚至更高。

如果您需要此信息並且表已正確索引,則聯接查詢應該是提取數據的非常合理的方法。 您可以通過在查詢之前添加explain來檢查索引是否正在使用。

當您說“大部分時間都花在MySQL服務器上”時,您是否考慮到返回數千行需要時間? 您可以嘗試執行相同的查詢,但要替換select . . . select . . . 使用select count(*)來查看底層查詢的性能。 另一種方法是將order by <something> limit 1到現有查詢中- order by必須在返回結果之前完全處理查詢。

最后,如果這只是一個問題,那么自從按照您希望的方式工作以來,發生了什么變化?

我不是數據庫專家,但是僅從您當前在應用程序或網頁中需要的數據庫中查詢信息可能有意義。 我想這應該會在相當短的時間內完成。 然后可以在實際需要時從數據庫中查詢其余的數據。

請注意,數據庫服務器正在內存中構建一個大表,所有聯接都將在此表中合並。 如果服務器的內存太少,則可能很難建立該表。 (盡管在您的情況下可能並非如此...)

您應盡可能讓數據庫處理聯接,並避免進行不必要的查詢。 從理論上講,這應該是最佳的。 只要所有連接字段都已建立索引,您的查詢就可以了。 所聲明的容量並不驚人,並且響應時間應該很好(再次,前提是創建了所有索引)。 請記住,很少有返回很多記錄的查詢(當然是報告),這在應用程序中應該使用分頁來控制。

暫無
暫無

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

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