PHP面試之分庫分表

[TOC]

真題

簡述MySQL分表操作和分區(qū)操作的工作原理,分別說說分區(qū)和分表的使用場景和各自的優(yōu)缺點(diǎn)。

分區(qū)表的原理

工作原理

對(duì)用戶而言,分區(qū)表是一個(gè)獨(dú)立的邏輯表,但是底層 MYSQL將其分成了多個(gè)物理子表,這對(duì)用戶來說是透明的,每一個(gè)分區(qū)表都會(huì)使用一個(gè)獨(dú)立的表文件。

創(chuàng)建表時(shí)使用 partition by子句定義每個(gè)分區(qū)存放的數(shù)據(jù),執(zhí)行查詢時(shí),優(yōu)化器會(huì)根據(jù)分區(qū)定義過濾那些沒有我們需要數(shù)據(jù)的分區(qū),這樣查詢只需要查詢所需數(shù)據(jù)在的分區(qū)。

分區(qū)的主要目的是將數(shù)據(jù)按照一個(gè)較粗的粒度分在不同的表中,這樣可以將相關(guān)的數(shù)據(jù)存放在一起,而且如果想一次性刪除整個(gè)分區(qū)的數(shù)據(jù)也很方便。

使用場景

  • 表非常大,無法全部存在內(nèi)存,或者只在表的最后有熱點(diǎn)數(shù)據(jù)其他都是歷史數(shù)據(jù)
  • 分區(qū)表的數(shù)據(jù)更易維護(hù),可以對(duì)獨(dú)立的分區(qū)進(jìn)行獨(dú)立的操作
  • 分區(qū)表的數(shù)據(jù)可以分布在不同的機(jī)器上,從而高效使用資源
  • 可以使用分區(qū)表來避免某些特殊的瓶頸
  • 備份和恢復(fù)獨(dú)立的分區(qū)

限制

  • 一個(gè)表最多只能有1024個(gè)分區(qū)
  • MySQL 5.1 版本中,分區(qū)表表達(dá)式必須是整數(shù),5.5可以使用列分區(qū)
  • 分區(qū)字段中如果有主鍵和唯一索引列,那么主鍵列和唯一索引列都必須包含進(jìn)來;
  • 分區(qū)表中無法使用外鍵約束
  • 需要對(duì)現(xiàn)有表的結(jié)構(gòu)進(jìn)行修改
  • 所有分區(qū)都必須使用相同的存儲(chǔ)引擎
  • 分區(qū)函數(shù)中可以使用的函數(shù)和表達(dá)式會(huì)有一些限制
  • 某些存儲(chǔ)引擎不支持分區(qū)
  • 對(duì)于MyISAM的分區(qū)表,不能使用load index into cache
  • 對(duì)于MyISAM表,使用分區(qū)表時(shí)需要打開更多的文件描述符

分庫分表的原理

工作原理

通過一些hash算法或工具實(shí)現(xiàn)將一張數(shù)據(jù)表垂直或者水平進(jìn)行物理分割。

使用場景

  • 單條記錄條數(shù)達(dá)到百萬到千萬級(jí)別
  • 解決表鎖的問題

分表方式

水平分割

表很大,分割后可以降低在查詢時(shí)需要讀的數(shù)據(jù)和索引的頁數(shù),同時(shí)也降低了索引的層數(shù),提高查詢速度


水平分割

使用場景

  • 表中的數(shù)據(jù)本身就有獨(dú)立性,例如表中分別記錄各個(gè)地區(qū)的數(shù)據(jù)或者不同時(shí)期的數(shù)據(jù),特別是有些數(shù)據(jù)常用,有些不常用
  • 需要把數(shù)據(jù)存放在多個(gè)介質(zhì)上

水平分表缺點(diǎn)

  • 給應(yīng)用增加復(fù)雜度,通常查詢時(shí)需要多個(gè)表名,查詢所有數(shù)據(jù)都需 UNION操作
  • 在許多數(shù)據(jù)庫應(yīng)用中,這種復(fù)雜性會(huì)超過它帶來的優(yōu)點(diǎn),查詢時(shí)會(huì)增加讀一個(gè)索引層的磁盤次數(shù)

垂直分割

把主鍵和一些列放在一個(gè)表,然后把主鍵和另外的列放在另一張表中。


垂直分割

使用場景

  • 如果一個(gè)表中某些列常用,而另外一些列不常用
  • 可以使數(shù)據(jù)行變小,一個(gè)數(shù)據(jù)頁能存儲(chǔ)更多數(shù)據(jù),查詢時(shí)減少I/O次數(shù)

垂直分表缺點(diǎn)

  • 管理冗余列,查詢所有數(shù)據(jù)需要join操作

分表的缺點(diǎn)

  • 有些分表的策略基于應(yīng)用層的邏輯算法,一旦邏輯算法改變,整個(gè)分表邏輯都會(huì)改變,擴(kuò)展性較差
  • 對(duì)于應(yīng)用層來說,邏輯算法無疑增加開發(fā)成本

延伸:MySQL的主從復(fù)制原理及負(fù)載均衡

MySQL的主從復(fù)制原理

  • 主庫上把數(shù)據(jù)庫上把更改記錄到二進(jìn)制日志
  • 從庫主庫的日志復(fù)制到自己的中繼日志
  • 從庫讀取中繼日志中的事件,將其重放在從庫數(shù)據(jù)庫中

主從復(fù)制解決的問題

  • 數(shù)據(jù)分布:隨意停止或開始復(fù)制,并在不同地理位置分布數(shù)據(jù)備份
  • 負(fù)載均衡:降低單個(gè)服務(wù)器的壓力
  • 高可用和故障切換:幫助應(yīng)用程序避免單點(diǎn)失敗
  • 升級(jí)測試:可以使用更高版本的 MYSQL作為從庫
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容