2015-09-19 77 views
1

我需要在我的MySQL數據庫中存儲一些社會ID(Facebook /谷歌/ Twitter用戶ID,Facebook地點ID,ECC ..)。我在這裏找到了很多關於stackoverflow的問題,但是我沒有找到滿意的答案。例如,你不能確定100%的Facebook ID將始終是一個無符號的bigint,從Facebook文檔中將facebook ID描述爲「數字字符串」。 Google ID似乎比bigint大一個數字。如何將社會ID存儲在MySQL數據庫中

我相信varchar列上的索引比bigint列上的索引慢,因此我認爲在可能的情況下使用bigint會比varchar更好。但是我意識到你可以用適當的屬性將varchar存儲爲二進制文件。

因爲這個原因,我想爲所有這些社會id和(因爲排序不是問題)使用varchar將它存儲爲二進制(屬性=二進制),這是因爲我需要一個快速索引。 你的想法是什麼:這是一個好的和快速的解決方案? 感謝

+0

快速索引?有索引慢嗎? –

+0

嗯,我相信一個varchar列上的索引會比int列慢,不是嗎? –

+0

不,不是真的。只要你做得對,他們或多或少都是一樣的。看到我的答案。 –

回答

2

我用varchar。您對這些差異是正確的,但更重要的是,目前的類型不會保證不變。例如,Facebook改變了過去的規模,他們在某處提到可能包含字符。

索引是一個索引,如果做得對,就沒有必要擔心它的性能。數字索引或varchar之間沒有真正的區別。

+0

謝謝,這是什麼意思「做對了」? –

+0

這是一個很長的話題,但它意味着創建您的查詢將使用的索引。例如,如果您在'varchar'列上創建索引,併發出類似於SELECT * FROM my_table WHERE my_column LIKE'abc%''的查詢,那麼此查詢將不會使用索引並且運行速度非常慢。要解決這個問題,你只需要在前三個字符上創建一個索引。但是,如果您有另一個查詢,例如'SELECT * FROM my_table WHERE my_column ='xxxx',那麼您需要在整個列上使用第二個索引。這也適用於數字列,但它們更容易理解。 –

+1

我可以確認。我自己執行了一些基準測試:我看不到bigint或varchar上的任何索引。 –

1

BIGINT +索引鍵+ INNODB =快速

+1

我知道,但它是不可行的,當社會id不是bigint –

+0

以及一個bigint無符號使用8字節和最大長度是18446744073709551615如果facebook ids是主要比unsint bigint那麼唯一的選擇是使用CHAR(if你知道的長度)或者一個varchar,並使用ROW_FORMAT = FIXED的MyISAM引擎,另一個巨大的改進是創建9來存儲fb id。如果一個facebook id以2開頭,則SELECT將轉到表2,如果另一個facebook id以6開頭,則轉到表6,這是分配id並且不對所有facebook id使用單個表。 –

+0

檢查這個帖子看到的速度或ROW_FORMAT = FIXED:http://www.soliantconsulting.com/blog/2012/09/mysql-optimization-faster-selects-myisam-fixed-row-format –

相關問題