2017-06-14 81 views
-1

我只想問下面是否有這種數據庫設計,下面的查詢會對查詢性能產生很大影響,或者應該分解查詢而不是多個子查詢。雖然這個子查詢適用於我,但我只想確保有一天它不會影響性能。我的目標是使用這個查詢,我想爲所有這些表生成一個動態查詢。查詢示例是查看特定商品中出席的參與者列表,並在2個給定日期之間開始日期。提前感謝您。查詢性能影響

enter image description here

下面是我的示例代碼,將在年內1至3歲之間查看出席。

SELECT TT.title, TTP.*, TS.*, TP.lastname, TP.firstname, (DATE_FORMAT(NOW(), '%Y') - DATE_FORMAT(TP.birthday, '%Y') - (DATE_FORMAT(NOW(), '00-%m-%d') < DATE_FORMAT(TP.birthday, '00-%m-%d')))AS age, TP.birthday 
FROM tbl_trainingparticipant AS TTP 
LEFT JOIN ( 
    SELECT t1.* 
    FROM tbl_schedules t1 
    WHERE t1.sched_id = (
     SELECT t2.sched_id 
     FROM tbl_schedules t2 
     WHERE t2.training_id = t1.training_id 
     ORDER BY t2.sched_id DESC LIMIT 1 
    ) 
)AS TS ON TTP.training_id = TS.training_id 
LEFT JOIN tbl_participants AS TP 
ON TTP.participant_id = TP.participant_id 
LEFT JOIN tbl_trainings AS TT 
ON TT.training_id = TS.training_id 
HAVING age BETWEEN 1 AND 3 
+0

這可能屬於代碼審查。 –

+0

只有您知道它對數據集的性能影響,以及您認爲可接受的性能。實施,測試,測量,分析,優化。 – Adrian

+0

兩個表格,每個表格有10個以上的「關係」表格,將它們連接在一起。相當標準。你當然不想把它們合併成一張表。對於時間表的子查詢有點雜亂,但我想如果你只需要選擇每個訓練課程中應該做的最新時間表。如果'tbl_schedules' <->'tbl_trainings'應該總是1-1,那麼''tbl_schedules'中的'training_id'是唯一的。 – ebyrob

回答

0

SQL具有彼此內的能力嵌套查詢。子查詢是嵌套在另一個SELECT語句中的 SELECT語句,並返回中間結果的 。 SQL首先執行最內層的子查詢 ,然後執行下一級。

所以,如果你使用嵌套的選擇你分配任務到MySQL執行兩個查詢發送到一起。通常,一次旅行比幾次快。

+0

我對mysql查詢的經驗是性能是不可預知的和挑剔的。很多時候,我只是通過將邏輯移入子查詢來修改查詢,發現性能提高了幾倍。一些內存中的行操作可能比關鍵字查找慢,但儘可能快地減少總體行數並保持它不變是減少查詢時間的唯一半確定的方式。 'EXPLAIN'甚至會嘗試爲你計算行數。 – ebyrob

+0

@ebyrob是的,我相信你,但任何規則都可以有一些例外。我說的是規則,體驗會給出最準確的答案。 –

+0

您似乎正在制定一個關於多個執行單元比單個更大的執行單元慢的規則?我只是指出這與我所有的經驗以及我在這個問題上所知甚少的理論背道而馳。 (解決問題的一件事就是將問題分解爲更小的部分)請記住,MySQL不會通過網絡發送查詢片段,它們都已經在單個實例上。 – ebyrob