2016-01-21 44 views
1

我想問一下這種方法是否可行。我有一張名爲收入的巨大表格,我經常需要查詢。MySQLi與PHP的臨時表

我想優化,以便我只根據相關的campaign_id查詢。我需要更快地完成查詢!

我認爲可能的解決方案是在我的PHP文件的頂部附近創建一個臨時表,然後在最後刪除臨時表。

在我應該能夠在臨時表上運行更密集的查詢,因爲它有一個更有限的數據集。

我對使用這種方法有點害怕。

  1. 我對這種方法的一般想法是對的嗎?
  2. 我是否正確地寫了這些查詢和PHP?
  3. 這些表格是否會被正確刪除?我有點擔心臨時桌子四處亂竄,崩潰甚至致命地拖延我的實例。

    //Create temporary table for the campaign_id 
    
    $query = "CREATE TEMPORARY TABLE IF NOT EXISTS earnings_temp AS (SELECT * FROM earnings WHERE earning_paid_campaign_id = ? OR earning_free_campaign_id = ?)"; 
    if ($statement = $mysqli->prepare($query)) 
    { 
        $statement->bind_param("ii", $campaign_id, $campaign_id); 
        $statement->execute(); 
        $statement->close(); 
    } 
    
    ....VARIOUS QUERIES ON earnings_temp..... 
    
    //Drop temporary table for campaign_id 
    $query = "DROP TEMPORARY TABLE IF EXISTS earnings_temp"; 
    if ($statement = $mysqli->prepare($query)) 
    { 
        $statement->execute(); 
        $statement->close(); 
    } 
    
+0

對不起,關於代碼格式。該網站必須是竊聽器,因爲如果任何人都可以進行編輯,我不能將它放在{}我欣賞... {0} –

+0

@Gusstavv Gil謝謝:) –

+1

NP;)。格式化程序可能會在某些代碼上出現錯誤。您可以通過在每行前面放置幾個空格來手動將其設置爲代碼格式。我就是這麼做的,因爲{}按鈕也對我產生了影響。 –

回答

1
  1. 你是對的。製作臨時表格有助於在某些情況下優化您的工作流程。大多數情況下,處理大型數據集時(如您所建議的那樣)。

  2. 你的PHP似乎是正確的。你創造它,然後你將它處置掉。

  3. 不要擔心桌子四處亂拋,甚至會導致我的實例崩潰,因爲當連接被切斷時它們會自動丟棄。 但要小心,如果表格變得太大,它們最終會從內存類型轉移到磁盤表格,從而降低其速度。另外如果有太多的併發連接,並且你沒有足夠的內存,它可能會阻止數據庫。但是一個適當的服務器配置可以避免這種情況。

+0

我明白了,所以我基本上是將CPU的壓力從基本上移動/擴展到內存/高清? –

+0

當你說「連接被切斷」這是否意味着當我的PHP文件結束/死亡時,表格會自動刪除? –

+1

是的,因爲處理大量數據集會大量使用硬盤和內存,除非您僅使用索引,而且,當腳本完成執行時,臨時表將自動銷燬 –