2012-06-25 72 views
0

我有一個大型數據庫有兩個表:stat和total。mysql快速選擇查詢而不讀取所有分區

的關係的例子如下:

STAT:

| ID | total event | 
+--------+--------------+ 
| 7 | 2   | 
| 8 | 1   | 

TOTAL:

|ID | Event  | 
+---+--------------+ 
| 7 | "hello"  | 
| 7 | "everybody" | 
| 8 | "hi"   | 

這是一個非常簡化的版本;還要考慮STAT表可能有500K記錄,並且對於每個STAT我可以有大約200個TOTAL行。

目前,如果我在表TOTAL中運行一個簡單的SELECT查詢,系統非常慢。

任何人都可以幫助我創建TOTAL表的一些建議嗎?是否有可能向MySQL表示已經對id列進行了排序,以便沒有理由掃描所有行直到結束,例如,id=7

+0

表沒有排序。 –

+0

你運行這個數據庫的硬件是什麼?如果它是一個共享的Linux Web服務器,則可能是升級的時候了! – halfer

+0

此刻正在PC上運行..數據庫是本地運行的程序的輸出 –

回答

0

你可以添加一個索引,此外你可以對你的表進行分區。

+0

然後如果我做了一個分區,我還應該添加另一個表的映射權?與映射我打算:在分區號1我有從1到10的ID例如.. –

+0

沒有..表中有大量的數據,你可以將它分成小塊,但請記住,你所在的列對錶進行分區應始終位於該表上每個查詢的where子句中的子句中。否則它會掃描所有的分區 –

+1

50萬條記錄可能爲時過早分割,imo。等待,直到你有10M記錄':)' – halfer

2
  1. INDEX(ID)添加到您的表(都),如果您還沒有。

  2. SELECT COUNT(*) FROM TOTAL WHERE ID=7 - >如果ID索引,這將會很快。

+0

ID是關鍵是主在這裏鍵,它已被自動索引 –

+3

@SashiKant:'TOTAL(ID)'不是唯一的,所以它不能是主鍵。 「 –

+0

IN 」SELECT COUNT(*)FROM TOTAL WHERE ID = 7 - >如果ID被索引,這將是快速的「,你正在考慮ID是一個主鍵 –

0

根據@ypercube的評論,表不存儲在一個排序的狀態,所以不能「告訴」這個數據庫。但是,您可以在表格上添加索引以加快搜索速度。

一個重要的事情要檢查 - 它看起來像TOTAL.ID的目的是作爲一個外鍵 - 如果是這樣,表TOTAL應該有一個叫做ID主鍵。相反,將該名稱的現有列重命名爲STAT_ID,因此很明顯它是一個外鍵。然後在STAT_ID上添加一個索引。

最後,作爲一種風格,我建議您使表和列名不區分大小寫,並以小寫形式寫入。當關鍵字大寫,數據庫對象較低時,它可以更輕鬆地讀取SQL。