我在這裏要問一個問題,你們中許多人已經問自己,我想。我正在創建一個PHP網站,並且一切都一直順利運行,直到我決定用一些測試數據(實際數據,當應用程序開始真正使用時,將會變得更大)填充我的數據庫爲止。大多數情況仍然可以正常工作,但是一個特別的(並且非常重要的)功能開始執行時間爲三到四秒,而且大部分時間都花在了MySQL服務器上。許多(很多)SQL連接VS多個查詢
這裏的交易:我建立一個應用程序的一所學校,它需要將所有每天的時間表和教訓,每一個人,每一個房間,每一個類。數據庫的結構做了,創建索引,等等的問題是,由於所有這些數據是關係(並且可以跨多臺傳播)一個查詢來獲取他們都可能是這樣的:
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或更多。
不知道你的模式是不容易給意見,但是從你的查詢猜測它,似乎有什麼不對勁的地方。爲了提高性能,您是否已在所有表格中正確編制了所有相關字段(示例中的所有外鍵)的索引?此外,第二次加入'schedules_periods AS sulp'似乎是多餘的,只需將第一次加入更改爲'LEFT JOIN schedules_periods AS sup sup.ID_SCHEDULE = su.ID AND sup.period = sul.period'。關於查詢長度,您可以使用一些視圖來縮短查詢時間。規範化的數據庫沒有錯。 – Eggplant
像這樣的東西是nosql閃耀的地方..那是可怕的看看。 – sircapsalot
@Eggplant嗨。那麼,事實是(冗餘)查詢是我用來完成排序工作的一個小技巧。這有點難以解釋。這是因爲這些時間段是特定於時間表的,這意味着它們對於每個時間表都是不同的。因此,我不僅要選擇與課程相對應的時間段,還要選擇與整個時間表相對應的時間段,而只是在課程開始時排序。 :) –