2013-03-05 42 views
1

我下面的查詢查詢執行時間,並解釋輸出不對齊

SELECT STRAIGHT_JOIN a.* 
    FROM b 
    INNER JOIN a ON a.b_id = b.b_id 
    INNER JOIN c ON dd.a_id = a.id 
    WHERE a.a_type_id = 164 
    AND a.status = 1 
    AND NOT EXISTS (
     SELECT a2.* 
     FROM a a2 
     INNER JOIN c c2 ON c2.a_id = a2.id 
     INNER JOIN d d.a_id = a2.id 
     WHERE a.w_id = 567 
     AND c.ds_id = c2.ds_id 
    ) 
    order by b.id 
    LIMIT 1; 

解釋給出瞭如下結果

*************************** 1. row *************************** 
      id: 1 
    select_type: PRIMARY 
      table: b 
      type: index 
    possible_keys: index_b_on_b_id 
      key: PRIMARY 
     key_len: 4 
      ref: NULL 
      rows: 1 
      Extra: 
    *************************** 2. row *************************** 
      id: 1 
    select_type: PRIMARY 
      table: a 
      type: ref 
    possible_keys: PRIMARY,index_a_on_a_type_id,index_a_on_status,index_a_on_b_id,index_a_on_a_type_id_and_status 
      key: index_a_on_b_id 
     key_len: 4 
      ref: b.b_id 
      rows: 1 
      Extra: Using where 
    *************************** 3. row *************************** 
      id: 1 
    select_type: PRIMARY 
      table: c 
      type: ref 
    possible_keys: index_c_on_a_id 
      key: index_c_on_a_id 
     key_len: 4 
      ref: a.id 
      rows: 1 
      Extra: Using where 
    *************************** 4. row *************************** 
      id: 2 
    select_type: DEPENDENT SUBQUERY 
      table: c2 
      type: ref 
    possible_keys: index_c_on_ds_id,index_c_on_a_id 
      key: index_c_on_ds_id 
     key_len: 4 
      ref: c.ds_id 
      rows: 1 
      Extra: 
    *************************** 5. row *************************** 
      id: 2 
    select_type: DEPENDENT SUBQUERY 
      table: d 
      type: ref 
    possible_keys: index_d_on_a_id,index_d_on_w_id 
      key: index_d_on_a_id 
     key_len: 5 
      ref: c2.a_id 
      rows: 1 
      Extra: Using where 
    *************************** 6. row *************************** 
      id: 2 
    select_type: DEPENDENT SUBQUERY 
      table: a2 
      type: eq_ref 
    possible_keys: PRIMARY 
      key: PRIMARY 
     key_len: 4 
      ref: d.a_id 
      rows: 1 
      Extra: Using where; Using index 

從解釋的結果,要掃描的行只有一個,但實際執行時間超過一秒鐘。我知道解釋只是一個估計和實際執行可能會有所不同,但有什麼可以在這裏優化(添加新的索引,重寫查詢等)?

在表中的行數如下:

  • 一個=> 2585530

  • B => 10000

  • C => 2585525

  • d => 3350381

+0

如果您刪除「限制1」多少行正在評估? – Steve 2013-03-05 21:21:07

+0

@Steve,刪除「限制1」顯示20373行。 – bikashp 2013-03-06 02:22:07

+0

謝謝,我會寫一個通用的答案。我不認爲你是MySQL企業級客戶嗎? – Steve 2013-03-06 08:45:54

回答

0

在不知道所有信息(模式,數據和最終目標)的情況下很難回答這些問題,但我會嘗試以一種通用的方式提供一些輸入。

你正在評估你的查詢中的20,373行,並且只返回其中的一個,這表面上看起來像很多被丟棄的數據,因此可能值得研究。 讀取你的查詢幾乎是不可能的,以確定你想要做什麼(沒有我已經注意到的所有其他信息) - 但是我可以在這裏得到一個合理的想法。

我建議你看看試圖重構查詢的「NOT EXISTS(...)」元素,而是首先使用具有適當索引的條件語句選擇有效數據,然後將其餘數據加入到這第一個查詢。

這對您的數據結構來說可能不是完全可能的,但從提供的內容來看,這是我真正可以推薦的。如果這不合適,您可以使用更多信息或示例結構來編輯答案,包括完整模式,示例數據以及最終查詢應輸出的內容。