2009-09-30 37 views
0

我有一個MySQL(InnoDB的)表「項目」具有以下特點這個數據模型的性能好處是什麼?

  1. 數量衆多,且不斷增加。
  2. 大量的各種數據類型的列,包括'文本';
  3. 主鍵'item_id'存在。

有額外的要求如下:根據他們的狀態

  • 需要更新狀態
  • 以上兩種操作相當頻繁發生

    1. 需要查詢的項目。

      鑑於以上情況,我有兩個問題

      1. 將製作一個單獨的表有兩列,即item_idstatusitem_id作爲主鍵提供了更高的性能?
      2. 如果以上情況屬實,我將如何根據狀態解決查詢item_ids的問題?

      我在處理數據庫方面經驗不足。我希望你能忍受我:)

    回答

    3

    這被稱爲垂直分割。當數據實體具有多種訪問模式時,通常使用它,訪問模式以不同的頻率訪問實體屬性(表列)的不同子集。如果一個功能每秒只需要訪問一個或兩個列100次,而另一個應用程序功能需要訪問所有其他列,但一天只能訪問一次或兩次,那麼這種方法是有說服力的,並且會獲得顯着的性能改進。

    基本上,如您所建議的那樣,您將表格「拆分」爲兩個表格,這兩個表格都使用相同的鍵,具有一對一的FK/PK-> PK關係。在一張表中,您只放入那些頻繁訪問的列,並且將其餘列放在另一個將不太頻繁訪問的表中。然後,您可以根據每個表的實際訪問模式分別對每個表更合適地應用索引。

    +0

    感謝您的回答。 – nano 2009-09-30 19:56:18

    1

    如果你的狀態和你的item_id是唯一需要獲取的列,那麼創建一個索引會更有意義。

    create index status_item_id_items on items (status) 
    

    然後,您可以查詢你的結果將使用該索引:

    select item_id, status from items where status = 'status' 
    

    請記住,如果你沒有很多不同的狀態您的查詢可能最終返回了大量行和可能會很慢。如果你可以像日期時間那樣受到更多的「選擇性」列的約束,那會更好。

    +0

    謝謝文森特。但是,如果我索引item_id和狀態,不會更新表的狀態值越慢,隨着表的大小增加? 或者它不重要,因爲它只有兩列? – nano 2009-09-30 19:57:38

    +0

    爲了一次更新一行,這可能是您的用例,它應該可以忽略不計。這是事實,你有更多的索引來更新,但創建一個新的表會花費更多。 – Vincent 2009-09-30 20:03:45

    +0

    謝謝。非常感謝您的幫助。 – nano 2009-09-30 20:06:59

    0

    接聽第2部分第一次,你會做一個內部聯接的兩個表:

    SELECT i.*, s.StatusCode FROM items AS i INNER JOIN status AS s ON s.item_id = i.item_id 
    

    要回答第1部分,不過,我不認爲這樣做會得到你的任何性能優勢。

    相關問題