一、mysql分表的原因
1、當一張的資料達到幾百萬時,你查詢一次所花的時間會變多,如果有聯合查詢的話,我想有可能會死在那兒了。
分表的目的就在於此,減小資料庫的負擔,縮短查詢時間。
2、mysql中有一種機制是表鎖定和行鎖定,為什麼要出現這種機制,是為了保證資料的完整性,
我舉個例子來說吧,如果有二個sql都要修改同一張表的同一條資料,這個時候怎麼辦呢,是不是二個sql都可以同時修改這條資料呢?
很顯然mysql對這種情況的處理是,一種是表鎖定(myisam儲存引擎),乙個是行鎖定(innodb儲存引擎)。
表鎖定表示你們都不能對這張表進行操作,必須等我對錶操作完才行。行鎖定也一樣,別的sql必須等我對這條資料操作完了,才能對這條資料進行操作。
如果資料太多,一次執行的時間太長,等待的時間就越長,這也是我們為什麼要分表的原因。
二、分表的規則
這裡只討論最簡單的分表規則取模
假如我們需要把使用者表分為100張表
user進行水平的切分,產生兩個表結構完全一樣的user_1,user_2等表,user_1 + user_2 + …的資料剛好是乙份完整的資料。
1)我們採用最簡單的分表方案 取模
我們根據使用者的id來模100
比如 使用者id為1000156 模上100 為56 那新增資料或者讀取資料的時候 都是在user_56這個表操作
下面是分表的指令碼
#!/bin/sh# dev |idc
dbenv=dev
if [ "
$" = "
dev" ]; then
mysql_user=root
mysql_pass=root
mysql_host=
fiif [ "
$" = "
idc" ]; then
mysql_user=root
mysql_pass=root
mysql_host="
-h 10.10.10.10"fi
mysql_cmd="
mysql -u$ -p$ $ --default-character-set=utf8
"for i in
do$
下面是刪除表的指令碼
#!/bin/sh# dev |idc
dbenv=dev
if [ "
$" = "
dev" ]; then
mysql_user=root
mysql_pass=root
mysql_host=
fiif [ "
$" = "
idc" ]; then
mysql_user=midea
mysql_pass=md_midea
mysql_host="
-h 10.10.10.10"fi
mysql_cmd="
mysql -u$ -p$ $ --default-character-set=utf8
"for i in
do$
2)每張表需要保證 使用者的id為全域性唯一的
有個簡單的解決方案是
在資料庫裡面 建立乙個表 只有乙個字段 是專門用來取號碼的
即每次 需要建立乙個新使用者,則從這個表裡面取乙個號碼 同時讓這個號碼增加乙個
這個來保證每個使用者的id都是全域性唯一的
createtable
t_global_number (
f_global_id
bigint(20) not
null,
primary
key(f_global_id)
) engine
=innodb default charset=utf8
3)關於資料讀取
我們盡量讓請求不要直接去查詢資料庫
我們可以每次查到資料就放到redis的快取裡面。
如果資料沒改變則一直用快取
一旦資料改變了就 刪除快取
這樣可以減輕資料庫的查詢負擔
三、分庫分表產生的問題,及注意事項
1. 分庫分表維度的問題
假如使用者購買了商品,需要將交易記錄儲存取來,如果按照使用者的緯度分表,則每個使用者的交易記錄都儲存在同一表中,所以很快很方便的查詢到某使用者的購買情況,但是某商品被購買的情況則很有可能分布在多張表中,查詢起來比較麻煩。反之,按照商品維度分表,可以很方便的查詢到此商品的購買情況,但要查詢到買人的交易記錄比較麻煩。
所以常見的解決方式有:
a.通過掃表的方式解決,此方法基本不可能,效率太低了。
b.記錄兩份資料,乙份按照使用者緯度分表,乙份按照商品維度分表。
c.通過搜尋引擎解決,但如果實時性要求很高,又得關係到實時搜尋。
2. 聯合查詢的問題
聯合查詢基本不可能,因為關聯的表有可能不在同一資料庫中。
3. 避免跨庫事務
避免在乙個事務中修改db0中的表的時候同時修改db1中的表,乙個是操作起來更複雜,效率也會有一定影響。
4. 盡量把同一組資料放到同一db伺服器上
例如將賣家a的商品和交易資訊都放到db0中,當db1掛了的時候,賣家a相關的東西可以正常使用。也就是說避免資料庫中的資料依賴另一資料庫中的資料。
mysql的簡單介紹 mysql的簡單介紹
mysql的簡單介紹 資料庫的內部鏈結 1 連線管理器 使用者或應用程式連線 2 分析器 3 快取區4 優化器 優化器執行的結果交由儲存引擎,再轉向物理層 表空間 myisam每個表有三個檔案 frm 表結構 myd 表資料 myi 表索引 innodb 所有表空間再乙個檔案 資料庫失敗的原因 1 ...
MySQL分庫分表基礎表介紹 1st
這裡我們模擬乙個 的基本的表結。此結構由 使用者 門店 導購 門店商品 訂單 訂單對應的商品 其中,導購也是乙個使用者,門店是只屬於乙個店主的,同時店主本身也是乙個導購也是乙個普通使用者。結構圖 1 從session中獲得客戶id。2 可以通過時間戳等拼湊乙個訂單id 在建立表的時候為了方便我用自增...
mysql分表準則 Mysql分表準則
mysql分表準則 在大量使用mysql時,資料量大 高訪問時,為了提高效能需要分表處理,簡介下mysql分表的標準,後續會繼續補充 環境 業務型別 oltp 硬體 cpu 8cpu 2.4ghz mem 48g 磁碟 raid5 6 sas 什麼樣的表需要拆分 根據表的體積 表的行數 訪問特點來衡...