2009-11-27 33 views
0

我有一箇中等大小的記錄集合 - 大約2000萬 - 我需要加載到mySQL以用於數據分析。這些恰好是訪問地點的人的記錄。他們是唯一由三個數據項標識: - 一個獨特的INT 設計mySql索引和提高效率的主鍵

  • 人 -

    • 地方的字符串,有時候數字和字母有時如AB12345678
    • 訪問-similar以人

    我對這個人和訪問領域的內容沒有任何控制權,因爲這些是由不同的地方提供的,而且每個地方都有自己的事情。

    我可以找到一個人的所有記錄,通過匹配所有三個人匹配地點和人,以及一個單獨的記錄。

    我可以通過創建這樣一個表格讓在MySQL這項工作很好:

    CREATE TABLE ENCOUNTER (
        PLACE int(11) NOT NULL, 
        PERSON varchar(255) NOT NULL, 
        VISIT varchar(255) NOT NULL, 
        ARRIVAL_TIME datetime DEFAULT NULL, 
        DEPARTURE_TIME datetime DEFAULT NULL, 
        EVENT varchar(255) NOT NULL, 
        PRIMARY KEY (PLACE,PERSON,VISIT) 
    ) ENGINE=MyISAM DEFAULT CHARSET=latin1 ROW_FORMAT=DYNAMIC; 
    

    我的MyISAM去,因爲我不需要在此表中ACID事務的完整性;它用於統計報告,所以如果它是一行或兩行陳舊,這是沒有問題的。

    該表通常會遇到只更改其中一個字段的UPDATE,如DEPARTURE_TIME。這些UPDATE很可能是新行INSERT的兩倍。不需要更新地點,人員或訪問標識符。

    這裏的一些問題:

    我會過得更好的性能明智的一個索引和鍵列串聯的地方/人/參觀信息?

    我爲varchar索引獲得了多少點擊?是否值得將它們限制在一個固定長度的字段?

    從收集的智慧的任何其他建議?

    謝謝。

  • 回答

    0

    您的索引是正確的。你不可能做得比這更好。

    這是一個完美的,非顯而易見的使用分區的機會。我有一種感覺,你所有的分析都將基於地點。如果是這樣,然後創建一個散列分區基礎上發生的列,就像這樣:

    ALTER TABLE encounter PARTITION BY KEY(place) PARTITIONS 12; 
    

    這會讓你的查詢速度更快,因爲MySQL的知道做一個分析時,它可以跳過看行的1/12一個地方。

    +0

    謝謝。實際上,大部分分析可能基於我的模式中的一個時間戳。麻煩的是,它們可以在行被創建後進行更改。但是分區是一個非常好的主意。 – 2009-11-27 17:42:01

    0

    我可以找到一個人的所有記錄,通過匹配所有三個匹配的地方和人,以及一個單獨的記錄。

    如果您要搜索訪問過的人的所有地點,則需要在(person, place)上添加附加索引。

    對於varchar索引我有多大的打擊?是否值得將它們限制在一個固定長度的字段?

    對於INTVARCHAR記錄,鍵擊時間相同。

    對於VARCHAR字段,重要的遺漏是更昂貴的。

    +0

    感謝這個信息,Q!我無法搜索一個人訪問的所有地點,因爲每個地點都分配了自己的人員ID。 地點=醫院 人=醫院分配的醫療記錄號 訪問=醫院分配的患者訪問標識符。 – 2009-11-27 22:52:35