2012-04-17 34 views
1

所以basicly我有一個由約700million行,然後每天約200K-300K行,每月底不斷更新的表,我會消滅這更多數據比3個月大。最好的方法上多列索引動態選擇

CREATE TABLE TESTRECORD (
    TIMEADDED timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, 
    SERIAL varchar(8) NOT NULL, 
    ENDTIME varchar(14) NOT NULL, 
    MODEL varchar(2) NOT NULL, 
    PROCESS int(4) NOT NULL, 
    PF varchar(4) NOT NULL, 
    COMID varchar(6) NOT NULL, 
    COMTP varchar(3) NOT NULL, 
    TRIAL varchar(4) NOT NULL, 
    TEST varchar(8) NOT NULL, 
    SECTION int(2) NOT NULL, 
    DATA_0 float NOT NULL, 
    DATA_1 float NOT NULL, 
    DATA_2 float NOT NULL, 
    DATA_3 float NOT NULL, 
    DATA_4 float NOT NULL, 
    DATA_5 float NOT NULL, 
    PRIMARY KEY (SN,ENDTIME,SECTION), 
    UNIQUE KEY BASESN (SN,ENDTIME,MODEL,PROCESS,PF,COMID,TRIAL,TEST,SECTION), 
    KEY COMID (COMID), 
    KEY TRIAL (TRIAL), 
    KEY PF (PF), 
    KEY TEST (TEST) 
) ENGINE=MyISAM DEFAULT CHARSET=latin1; 

唯一鍵定義了將在select語句中使用的參數。 由於該表的基本功能是用於動態數據分析,因此沒有特定的命令將在where子句中發生什麼以及將使用多少個子句,並且可能會有一些隨機分組由一個或兩個還有獨特的關鍵。所以幾乎不可能爲所有可能的組合編制索引,以確保在任何給定選擇上快速操作。

據我的理解,mysql使用的索引基於它們在模式中列出的順序,所以在我的情況下,如果在select語句中使用SN,ENDTIME和PF,則只有前2列將用於唯一鍵。有沒有什麼有效的方法,我可以像索引每列或查詢技術打破索引,以加快一點或至少在where子句中的不同組合的列上實現大致相同的性能?

非常感謝你提前〜!

+1

看到這個問題:[我應該定義索引(A)和索引(B)還是索引(A,B),或者兩者兼有?](http://stackoverflow.com/questions/9805768/shalli-i- define-index-a-and-index-b-or-index-ab-or-both) – TMS 2012-04-17 19:05:47

回答

2

指數在MySQL的工作就像你可能會發現在本書的最後一個索引。如果你正在看一本「意大利辣香腸比薩餅」的烹飪書,你首先查看意大利辣香腸,然後查一下披薩。如果你只是在尋找「比薩餅」,那麼這個指數對你沒有任何幫助,因爲比薩餅在指數中是次要的意大利辣香腸 - 如果你先看看意大利辣香腸,你只能找到比薩餅。這就是X,Y列的索引如何工作。如果您計劃按照該順序在Colums X和Y上運行查詢,那麼兩個列上的索引合在一起是合理的。如果您想在X上運行查詢並在Y上查詢,那麼複合索引不會有太多的用途!

我建議你坐下來定義你會遇到什麼樣的查詢最頻繁,而分析您的存儲和處理能力。索引可能佔用大量空間,尤其是在數百萬行中工作時。索引是存儲空間和處理能力之間的典型折衷,沒有人不熟悉數據庫可以告訴你什麼是針對特定情況的最佳索引號或配置。

還請注意存儲在每列中的唯一值的數量。與Oracle不同,MySQL不支持標準表的位圖式索引(它使用B-Tree)。拋開技術細節,這意味着在具有相對較少數量的唯一值的列上構建索引不會爲您提供儘可能多的索引空間值。

最後要注意的是,對於某些類型的數據分析,你可能要考慮一些導出您的數據的存儲表。 MEMORY表基本上是臨時表,它們在用戶會話中保存其結構。他們丟失了他們的數據,但是當他們完成使用或發生崩潰時,他們的數據不會丟失。內存表支持散列索引列的值以加快數據檢索的HASH索引。在大多數情況下它們速度非常快,並且在正確使用時可以顯着提高性能。

我建議你看看這本書「高性能MySQL的」如果你是在DB的優化很感興趣。

+0

感謝您的解釋,可能是時候尋找一種方法,在不同結構的不同平臺上重建這個東西,並慢慢同步數據。 – 2012-04-17 20:33:41

+0

Infobright Community Edition將成爲您的用例的絕佳選擇。它將支持你正在處理的目標和數據量。它還使用內存知識網格,在查詢時提供亞秒級響應時間... – 2012-04-23 17:04:41

1

我會建議你考慮例如不同的存儲基於列的存儲引擎Infobright的像開源數據庫分析。它基於mysql架構,就像使用mysql一樣,除了適用於大數據和分析查詢。 www.infobright.org

+0

感謝您的信息! – 2012-04-17 20:41:41

+0

whoa .... infobright企業每年每TB的成本爲9.9萬美元,而其社區版本在大量刪除後無法對錶進行碎片整理。好像我需要清理我的西裝,並與我的經理長時間談話lol – 2012-04-18 00:09:58

+0

ICE沒有DML(插入/更新/刪除),批量加載和查詢。沒有理由刪除並且使用列架構和知識網格,刪除是無用的,刪除沒有任何好處。根據內存中的知識網格解析查詢。給我發電子郵件craigtrombly @ hotmail,我可以給你一些很好的理由,爲什麼你應該使用ICE。我和其他大學一樣使用它。 – 2012-04-19 15:07:39