mysql之分表

分表是一種設計方法。而不是數據庫本身所提供的功能。

在大型數據量的環境下,經常會看到這樣的命名:

xxx_001
xxx_002
xxx_003

------------------------------------------------------------

[b]產生背景:[/b]

當一張的數據達到幾百萬時,查詢一次所花的時間會變多。尤其是範圍查詢。
如果有聯合查詢的話,可能會死在那兒了。
分表的目地就在於此,縮小查詢範圍,減少時間,減輕數據庫的負擔。


[b]實例分析[/b]
MySQL如何將數據高效分表?

有一個大數據表(數據量上千萬),現在想做分表處理,
現在設計的做法是使用php程序,根據每列數據的主鍵user_id值計算出00-63的64個hash值,散列到64個表中,
請問在將數據導至新的分表時,除了將每一條數據計算出hash值,再插入到新表的方法外,有沒有更高效的方法?


-
類似的事情做過一次,當時數據會更多一點,有幾億,按userid 取模100分表的,大概過程是這樣的:
1、我可以很容易獲得我的useid的最大最小值:min_userid,max_userid。這樣粗略認爲總表的的userid範圍爲userlist = [min_userid...max_userid]
2、隨便用個腳本把userlist處理(mod或者hash)爲100個分組:arr0 ... arr99
arr0爲[0,10,20,30 ...]
3、根據 2 的結果拼接100個sql語句.
insert into tb_user_0 (select * from tb_user_all where userid in(arr0));
insert into tb_user_1 (select * from tb_user_all where userid in(arr1));
...
insert into tb_user_99 (select * from tb_user_all where userid in(arr99));
4、批量執行。當時幾億不到20分鐘就都搞定了。要比逐條數據處理快很多。
注:userid是有索引的。

-------


================================================================================
怎麼樣實現MYSQL數據庫分表?


假設一個論壇帖子按板塊分爲N個表

thread_bbs1
thread_bbs2
thread_bbs3
....
thread_bbsN

那一個用戶發佈的帖子就會散落在N個表裏,如果有個業務需要查看用戶的所有帖子總數並按時間排序用戶的所有發帖,就要join所有的表?

應該怎麼樣合理的分表呢?

-
Han Du
這個問題不在於如何分表和查詢,而在於如何做 數據冗餘。

你需要將用戶發帖的基本信息用另一些表來存儲,比如叫做 thread_user*,這些表按照用戶 id 分表,內容包括用戶 id、帖子 id、發帖時間等你需要的信息。

每次創建帖子的時候需要同時寫兩份,thread_bbs* 和 thread_user*,讀的時候按需讀取對應的表就可以。
-
按照用戶的唯一ID去路由分表。
-
分表只是爲了分散存儲壓力,查詢的話可以借鑑@Han Du 的方法,建個索引表,存儲基本信息。通過索引表去統計和排列,需要具體數據的時候再join。
很多開源的系統,尤其是國外的優秀商城產品,看下數據庫設計會發現他們很擅長使用索引表
-


-


MySQL如何將數據高效分表?
http://www.houziquan.com/question/94

怎麼樣實現MYSQL數據庫分表?
https://segmentfault.com/q/1010000000583058

mysql 分庫分表的方法(總結的,概括的)
http://www.cnblogs.com/joe-blog/p/5477380.html


-
發佈了279 篇原創文章 · 獲贊 4 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章