久久精品五月,日韩不卡视频在线观看,国产精品videossex久久发布 ,久久av综合

站長資訊網(wǎng)
最全最豐富的資訊網(wǎng)站

面試回答:MySQL每張表最好不超過2000萬數(shù)據(jù),對不對?

MySQL中每張表到底能存多少數(shù)據(jù)? 實際情況下,每張表由于自身的字段不同、字段所占用的空間不同等原因,它們在最佳性能下可以存放的數(shù)據(jù)量也就不同,需要手動計算才行。

事情是這樣的


下面是我朋友的面試記錄:

面試官:講一下你實習做了什么。

朋友:我在實習期間做了一個存儲用戶操作記錄的功能,主要是從MQ獲取上游服務發(fā)送過來的用戶操作信息,然后把這些信息存到MySQL里面,提供給數(shù)倉的同事使用。

朋友:由于數(shù)據(jù)量比較大,每天大概有四五千多萬條,所以我還給它做了分表的操作。每天定時生成3張表,然后將數(shù)據(jù)取模分別存到這三張表里,防止表內(nèi)數(shù)據(jù)過多導致查詢速度降低

這表述,好像沒什么問題是吧,別急,接著看:

面試官:那你為什么要分三張表呢,兩張表不行嗎?四張表不行嗎?

朋友:因為MySQL每張表最好不超過2000萬條數(shù)據(jù),否則會導致查詢速度降低,影響性能。我們每天的數(shù)據(jù)大概是在五千萬條左右,所以分成三張表比較穩(wěn)妥。

面試官:還有嗎?

朋友: 沒有了……你干嘛,哎呦

面試官:那你先回去等通知吧。

講完了,看出什么了嗎,你們覺得我這位朋友回答的有什么問題嗎?

前言


很多人說,MySQL每張表最好不要超過2000萬條數(shù)據(jù),否則就會導致性能下降。阿里的Java開發(fā)手冊上也提出:單表行數(shù)超過 500 萬行或者單表容量超過 2GB,才推薦進行分庫分表。

但實際上,這個2000萬或者500萬都只是一個大概的數(shù)字,并不適用于所有場景,如果盲目的以為表數(shù)據(jù)只要不超過2000萬條就沒問題了,很可能會導致系統(tǒng)的性能大幅下降。

實際情況下,每張表由于自身的字段不同、字段所占用的空間不同等原因,它們在最佳性能下可以存放的數(shù)據(jù)量也就不同。

那么,該如何計算出每張表適合的數(shù)據(jù)量呢?別急,慢慢往下看。

本文適合的讀者

閱讀本文你需要有一定的MySQL基礎,最好對InnoDB和B+樹都有一定的了解,可能需要有一年以上的MySQL學習經(jīng)驗(大概一年?),知道 “InnoDB中B+樹的高度一般保持在三層以內(nèi)會比較好” 這條理論知識。

本文主要是針對 “InnoDB中高度為3的B+樹最多可以存多少數(shù)據(jù)” 這一話題進行講解的。且本文對數(shù)據(jù)的計算比較嚴格(至少比網(wǎng)上95%以上的相關博文都要嚴格),如果你比較在意這些細節(jié)并且目前不太清楚的話,請繼續(xù)往下閱讀。

閱讀本文你大概需要花費10-20分鐘的時間,如果你在閱讀的過程中對數(shù)據(jù)進行驗算的話,可能要花費30分鐘左右。

本文思維導圖


面試回答:MySQL每張表最好不超過2000萬數(shù)據(jù),對不對?

千萬級數(shù)據(jù)并發(fā)如何處理?進入學習

基礎知識快速回顧


眾所周知,MySQL中InnoDB的存儲結構是B+樹,B+樹大家都熟悉吧?特性大概有以下幾點,一起快速回顧一下吧!

注:下面這這些內(nèi)容都是精華,看不懂或者不理解的同學建議先收藏本文,之后有知識基礎了再回來看。??

  • 一張數(shù)據(jù)表一般對應一顆或多顆樹的存儲,樹的數(shù)量與建索引的數(shù)量有關,每個索引都會有一顆單獨的樹。

  • 聚簇索引和非聚簇索引:

    主鍵索引也是聚簇索引,非主鍵索引都是非聚簇索引。除格式信息外,兩種索引的非葉子節(jié)點都是只存索引數(shù)據(jù)的,比如索引為id,那非葉子節(jié)點就是存的id數(shù)據(jù)。

    葉子節(jié)點的區(qū)別如下:

    • 聚簇索引的葉子節(jié)點一般情況下存的是這條數(shù)據(jù)的所有字段信息。所以我們 select * from table where id = 1 的時候,都是要去葉子節(jié)點拿數(shù)據(jù)的。
    • 非聚簇索引的葉子節(jié)點存的是這條數(shù)據(jù)所對應的主鍵和索引列信息。比如這條非聚簇索引是username,然后表的主鍵是id,那該非聚簇索引的葉子節(jié)點存的就是 username 和 id,而不存其他字段。 相當于是先從非聚簇索引查到主鍵的值,再根據(jù)主鍵索引去查數(shù)據(jù)內(nèi)容,一般情況下要查兩次(除非索引覆蓋),這也稱之為 回表 ,就有點類似于存了個指針,指向了數(shù)據(jù)存放的真實地址。
  • B+樹的查詢是從上往下一層層查詢的,一般情況下我們認為B+樹的高度保持在3層以內(nèi)是比較好的,也就是上兩層是索引,最后一層存數(shù)據(jù),這樣查表的時候只需要進行3次磁盤IO就可以了(實際上會少一次,因為根節(jié)點會常駐內(nèi)存),且能夠存放的數(shù)據(jù)量也比較可觀。

    如果數(shù)據(jù)量過大,導致B+數(shù)變成4層了,則每次查詢就需要進行4次磁盤IO了,從而使性能下降。所以我們才會去計算InnoDB的3層B+樹最多可以存多少條數(shù)據(jù)。

  • MySQL每個節(jié)點大小默認為16KB,也就是每個節(jié)點最多存16KB的數(shù)據(jù),可以修改,最大64KB,最小4KB。

    擴展:那如果某一行的數(shù)據(jù)特別大,超過了節(jié)點的大小怎么辦?

    MySQL5.7文檔的解釋是:

    • 對于 4KB、8KB、16KB 和 32KB設置 ,最大行長度略小于數(shù)據(jù)庫頁面的一半 。例如:對于默認的 16KB頁大小,最大行長度略小于 8KB ,默認32KB的頁大小,則最大行長度略小于16KB。

    • 而對于 64KB 頁面,最大行則長度略小于 16KB。

    • 如果行超過最大行長度, 則將可變長度列用外部頁存儲,直到該行符合最大行長度限制。就是說把varchar、text這種長度可變的存到外部頁中,來減小這一行的數(shù)據(jù)長度。

面試回答:MySQL每張表最好不超過2000萬數(shù)據(jù),對不對?

文檔地址:MySQL :: MySQL 5.7 Reference Manual :: 14.12.2 File Space Management

  • MySQL查詢速度主要取決于磁盤的讀寫速度,因為MySQL查詢的時候每次只讀取一個節(jié)點到內(nèi)存中,通過這個節(jié)點的數(shù)據(jù)找到下一個要讀取的節(jié)點位置,再讀取下一個節(jié)點的數(shù)據(jù),直到查詢到需要的數(shù)據(jù)或者發(fā)現(xiàn)數(shù)據(jù)不存在。

    肯定有人要問了,每個節(jié)點內(nèi)的數(shù)據(jù)難道不用查詢嗎?這里的耗時怎么不計算?

    這是因為讀取完整個節(jié)點的數(shù)據(jù)后,會存到內(nèi)存當中,在內(nèi)存中查詢節(jié)點數(shù)據(jù)的耗時其實是很短的,再配合MySQL的查詢方式,時間復雜度差不多為

    O(log2N)O(log_2N)

    ,相比磁盤IO來說,可以忽略不計。

MySQL InnoDB 節(jié)點的儲存內(nèi)容


在Innodb的B+樹中,我們常說的節(jié)點被稱之為 頁(page),每個頁當中存儲了用戶數(shù)據(jù),所有的頁合在一起組成了一顆B+樹(當然實際會復雜很多,但我們只是要計算可以存多少條數(shù)據(jù),所以姑且可以這么理解?)。

是InnoDB存儲引擎管理數(shù)據(jù)庫的最小磁盤單位,我們常說每個節(jié)點16KB,其實就是指每頁的大小為16KB。

這16KB的空間,里面需要存儲 頁格式 信息和 行格式 信息,其中行格式信息當中又包含一些元數(shù)據(jù)和用戶數(shù)據(jù)。所以我們在計算的時候,要把這些數(shù)據(jù)的都計算在內(nèi)。

頁格式

每一頁的基本格式,也就是每一頁都會包含的一些信息,總結表格如下:

名稱 空間 含義和作用等
File Header 38字節(jié) 文件頭,用來記錄頁的一些頭信息。
包括校驗和、頁號、前后節(jié)點的兩個指針、
頁的類型、表空間等。
Page Header 56字節(jié) 頁頭,用來記錄頁的狀態(tài)信息。
包括頁目錄的槽數(shù)、空閑空間的地址、本頁的記錄數(shù)、
已刪除的記錄所占用的字節(jié)數(shù)等。
Infimum & supremum 26字節(jié) 用來限定當前頁記錄的邊界值,包含一個最小值和一個最大值。
User Records 不固定 用戶記錄,我們插入的數(shù)據(jù)就存儲在這里。
Free Space 不固定 空閑空間,用戶記錄增加的時候從這里取空間。
Page Directort 不固定 頁目錄,用來存儲頁當中用戶數(shù)據(jù)的位置信息。
每個槽會放4-8條用戶數(shù)據(jù)的位置,一個槽占用1-2個字節(jié),
當一個槽位超過8條數(shù)據(jù)的時候會自動分成兩個槽。
File Trailer 8字節(jié) 文件結尾信息,主要是用來校驗頁面完整性的。

示意圖:

面試回答:MySQL每張表最好不超過2000萬數(shù)據(jù),對不對?

頁格式這塊的內(nèi)容,我在官網(wǎng)翻了好久,硬是沒找到?。。。。不知道是沒寫還是我眼瞎,有找到的朋友希望可以在評論區(qū)幫我掛出來?。

所以上面頁格式的表格內(nèi)容主要是基于一些博客中學習總結的。

另外,當新記錄插入到 InnoDB 聚集索引中時,InnoDB 會嘗試留出 1/16 的頁面空閑以供將來插入和更新索引記錄。如果按順序(升序或降序)插入索引記錄,則生成的頁大約可用 15/16 的空間。如果以隨機順序插入記錄,則頁大約可用 1/2 到 15/16 的空間。參考文檔:MySQL :: MySQL 5.7 Reference Manual :: 14.6.2.2 The Physical Structure of an InnoDB Index

除了 User RecordsFree Space 以外所占用的內(nèi)存是

38+56+26+8=12838 + 56 + 26 + 8 = 128

字節(jié),每一頁留給用戶數(shù)據(jù)的空間就還剩

16×1516×1024?128=1523216 times frac{15}{16} times 1024 – 128 = 15232

字節(jié)(保留了1/16)。

當然,這是最小值,因為我們沒有考慮頁目錄。頁目錄留在后面根據(jù)再去考慮,這個得根據(jù)表字段來計算。

行格式

首先,我覺得有必要提一嘴,MySQL5.6的默認行格式為COMPACT(緊湊),5.7及以后的默認行格式為DYNAMIC(動態(tài)),不同的行格式存儲的方式也是有區(qū)別的,還有其他的兩種行格式,本文后續(xù)的內(nèi)容主要是基于DYNAMIC(動態(tài))進行講解的。

官方文檔鏈接:MySQL :: MySQL 5.7 參考手冊 :: 14.11 InnoDB 行格式(包括下面的行格式內(nèi)容大都可以在里面找到)

面試回答:MySQL每張表最好不超過2000萬數(shù)據(jù),對不對?


每行記錄都包含以下這些信息,其中大都是可以從官方文檔當中找到的。我這里寫的不是特別詳細,僅寫了一些能夠我們計算空間的知識,更詳細內(nèi)容可以去網(wǎng)上搜索 “MySQL 行格式”。

名稱 空間 含義和作用等
行記錄頭信息 5字節(jié) 行記錄的標頭信息
包含了一些標志位、數(shù)據(jù)類型等信息
如:刪除標志、最小記錄標志、排序記錄、數(shù)據(jù)類型、
頁中下一條記錄的位置等
可變長度字段列表 不固定 來保存那些可變長度的字段占用的字節(jié)數(shù),比如varchar、text、blob等。
若變長字段的長度小于 255字節(jié),就用1字節(jié)表示;
若大于 255字節(jié),用2字節(jié)表示。
表字段中有幾個可變長字段該列表中就有幾個值,如果沒有就不存。
null值列表 不固定 用來存儲可以為null的字段是否為null。
每個可為null的字段在這里占用一個bit,就是bitmap的思想。
該列表占用的空間是以字節(jié)為單位增長的,例如,如果有 9 到 16 個
可以為null的列,則使用兩個字節(jié),沒有占用1.5字節(jié)這種情況。
事務ID和指針字段 6+7字節(jié) 了解MVCC的朋友應該都知道,數(shù)據(jù)行中包含了一個6字節(jié)的事務ID和
一個7字節(jié)的指針字段。
如果沒有定義主鍵,則還會多一個6字節(jié)的行ID字段
當然我們都有主鍵,所以這個行ID我們不計算。
實際數(shù)據(jù) 不固定 這部分就是我們真實的數(shù)據(jù)了。

示意圖:

面試回答:MySQL每張表最好不超過2000萬數(shù)據(jù),對不對?

另外還有幾點需要注意:

溢出頁(外部頁)的存儲

注意:這一點是DYNAMIC的特性。

當使用 DYNAMIC 創(chuàng)建表時,InnoDB 會將較長的可變長度列(比如 VARCHAR、VARBINARY、BLOB 和 TEXT 類型)的值剝離出來,存儲到一個溢出頁上,只在該列上保留一個 20 字節(jié)的指針指向溢出頁。

而 COMPACT 行格式(MySQL5.6默認格式)則是將前 768 個字節(jié)和 20 字節(jié)的指針存儲在 B+ 樹節(jié)點的記錄中,其余部分存儲在溢出頁上。

列是否存儲在頁外取決于頁大小和行的總大小。當一行太長時,選擇最長的列進行頁外存儲,直到聚集索引記錄適合 B+ 樹頁(文檔里沒說具體是多少?)。小于或等于 40 字節(jié)的 TEXT 和 BLOB 直接存儲在行內(nèi),不會分頁。

優(yōu)點

DYNAMIC 行格式避免了用大量數(shù)據(jù)填充 B+ 樹節(jié)點從而導致長列的問題。

DYNAMIC 行格式的想法是,如果長數(shù)據(jù)值的一部分存儲在頁外,則通常將整個值存儲在頁外是最有效的。

使用 DYNAMIC 格式,較短的列會盡可能保留在 B+ 樹節(jié)點中,從而最大限度地減少給定行所需的溢出頁數(shù)。

字符編碼不同情況下的存儲

char 、varchar、text 等需要設置字符編碼的類型,在計算所占用空間時,需要考慮不同編碼所占用的空間。

varchar、text等類型會有長度字段列表來記錄他們所占用的長度,但char是固定長度的類型,情況比較特殊,假設字段 name 的類型為 char(10) ,則有以下情況:

  • 對于長度固定的字符編碼(比如ASCII碼),字段 name 將以固定長度格式存儲,ASCII碼每個字符占一個字節(jié),那 name 就是占用 10 個字節(jié)。

  • 對于長度不固定的字符編碼(比如utf8mb4),至少將為 name 保留 10 個字節(jié)。如果可以,InnoDB會通過修剪尾部空格空間的方式來將其存到 10 個字節(jié)中。

    如果空格剪完了還存不下,則將尾隨空格修剪為 列值字節(jié)長度的最小值(一般是 1 字節(jié))。

    列的最大長度為:

    字符編碼的最大字符長度×N字符編碼的最大字符長度 times N

    ,比如 name 字段的編碼為 utf8mb4,那就是

    4×104 times 10

  • 大于或等于 768 字節(jié)的 char 列會被看成是可變長度字段(就像varchar一樣),可以跨頁存儲。例如,utf8mb4 字符集的最大字節(jié)長度為 4,則 char(255) 列將可能會超過 768 個字節(jié),進行跨頁存儲。

說實話對char的這個設計我是不太理解的,盡管看了很久,包括官方文檔和一些博客?,希望懂的同學可以在評論區(qū)解惑:

對于長度不固定的字符編碼這塊,char是不是有點像是一個長度可變的類型了?我們常用的 utf8mb4,占用為 1 ~ 4 字節(jié),那么 char(10) 所占用的空間就是 10 ~ 40 字節(jié),這個變化還是挺大的啊,但是它并沒有留足夠的空間給它,也沒有使用可變長度字段列表去記錄char字段的空間占用情況,就很特殊?

開始計算


好了,我們已經(jīng)知道每一頁當中具體存儲的東西了,現(xiàn)在我們已經(jīng)具備計算能力了。

由于頁的剩余空間我已經(jīng)在上面頁格式的地方計算過了,每頁會剩余 15232 字節(jié)可用,下面我們直接計算行。

非葉子節(jié)點計算

單個節(jié)點計算

索引頁就是存索引的節(jié)點,也就是非葉子節(jié)點。

每一條索引記錄當中都包含了當前索引的值一個 6字節(jié) 的指針信息一個 5 字節(jié)的行標頭,用來指向下一層數(shù)據(jù)頁的指針。

索引記錄當中的指針占用空間我沒在官方文檔里找到?,這個 6 字節(jié)是我參考其他博文的,他們說源碼里寫的是6字節(jié),但具體在哪一段源碼我也不知道?。

希望知道的同學可以在評論區(qū)解惑。

假設我們的主鍵id為 bigint 型,也就是8個字節(jié),那索引頁中每行數(shù)據(jù)占用的空間就等于

8+6+5=198 + 6 + 5 = 19

字節(jié)。每頁可以存

15232÷1980115232 div 19 approx 801

條索引數(shù)據(jù)。

那算上頁目錄的話,按每個槽平均6條數(shù)據(jù)計算的話,至少有

801÷6134801 div 6 approx 134

個槽,需要占用 268 字節(jié)的空間。

把存數(shù)據(jù)的空間分一點給槽的話,我算出來大約可以存 787 條索引數(shù)據(jù)。

如果是主鍵是 int 型的話,那可以存

贊(0)
分享到: 更多 (0)
?
網(wǎng)站地圖   滬ICP備18035694號-2    滬公網(wǎng)安備31011702889846號
久久精品五月,日韩不卡视频在线观看,国产精品videossex久久发布 ,久久av综合
国产亚洲在线观看| 免费国产自线拍一欧美视频| 黄色日韩在线| 国产亚洲一区二区手机在线观看 | 欧美日中文字幕| 另类欧美日韩国产在线| 国产亚洲一区| 激情婷婷综合| 91精品亚洲| 黄色av日韩| 香蕉国产精品| 91九色精品国产一区二区| 性欧美69xoxoxoxo| 久久精品123| 久久久久久夜| 色吊丝一区二区| 亚洲国产福利| 99视频精品全国免费| 久草免费在线视频| 成人黄色av| 亚洲va在线| 久久久影院免费| 国产欧美一区二区三区精品酒店| 九色porny丨国产首页在线| 偷拍精品精品一区二区三区| 日韩高清成人| 视频在线观看国产精品| 三级欧美韩日大片在线看| 亚洲精品三级| 91免费精品国偷自产在线在线| 欧美精品激情| 亚洲精品伊人| 日本成人一区二区| 国产探花在线精品| 免费在线亚洲欧美| 精品国产午夜| 亚洲国产专区校园欧美| 在线日韩视频| 蜜桃一区二区三区在线| 国产精品一区高清| 精品久久99| 999久久久免费精品国产| 亚洲高清不卡| 亚洲一区激情| 久久99国产精品视频| 国产91在线播放精品| 日韩在线免费| 亚洲欧美日韩精品一区二区 | 亚洲国产专区| 男人的天堂久久精品| 日本精品另类| 国内在线观看一区二区三区| 欧美精品羞羞答答| 中文字幕av亚洲精品一部二部 | 福利一区视频| 久久久一本精品| 亚洲精品女人| 美女性感视频久久| 麻豆精品在线播放| 欧美+亚洲+精品+三区| 免费日韩av| 久久精品国产99国产精品| 久久久久美女| 日韩视频1区| 999国产精品999久久久久久| 在线观看亚洲精品福利片| 欧美日韩一区二区高清| 国产999精品在线观看| 九一国产精品| 欧美日韩网址| 91精品韩国| 亚洲精品va| 国产精品免费不| 在线日韩电影| 亚洲人成在线影院| 麻豆91在线播放| 中文字幕高清在线播放| 亚洲少妇诱惑| 国产精品国码视频| 国产精品婷婷| 亚洲精品888| 国产精品91一区二区三区| 国产精品试看| 久久久国产精品网站| 中文日韩在线| 国产精品一页| 成人羞羞视频在线看网址| 日韩av中文在线观看| 深夜福利视频一区二区| 香蕉成人久久| 国产在线观看www| 日韩黄色在线观看| 久久大逼视频| 国产 日韩 欧美 综合 一区| 日本精品另类| 美女少妇全过程你懂的久久| 国产午夜一区| 亚洲精品乱码| 欧美日韩精品免费观看视完整| 久久av日韩| 免费成人在线影院| 在线观看精品| 精品成av人一区二区三区| 蜜臀久久99精品久久久久宅男| 国产精品毛片久久| 91国内精品| 黄页网站一区| 亚洲天堂久久| 精品国产一级| 欧美激情99| 亚洲三级视频| 美女毛片一区二区三区四区 | 奶水喷射视频一区| 天堂а√在线最新版中文在线| 国产欧美日韩一区二区三区在线| 精品91久久久久| 在线精品视频在线观看高清| 免费一级欧美在线观看视频| 亚洲精选91| 亚洲区第一页| 尤物在线精品| 国产精品免费看| 米奇777超碰欧美日韩亚洲| 国产日韩电影| 久久久久久久久99精品大| 高清精品久久| 中文在线а√天堂| 欧美a一区二区| 91福利精品在线观看| 亚洲精品国产精品粉嫩| 久久国产66| 亚洲精品在线a| 尹人成人综合网| 久久九九精品| 久久三级视频| 亚洲国产成人二区| 久久九九精品| 亚洲成av人片一区二区密柚| 日韩在线第七页| 波多野结衣久久精品| 国产精品网在线观看| 久久亚洲人体| 精品黄色一级片| 欧美aa在线观看| 久久男人av资源站| 精品国产免费人成网站| 久久久久美女| 国产精品av久久久久久麻豆网| 性欧美xxxx免费岛国不卡电影| 久久精品中文| 欧美日韩激情在线一区二区三区| 99在线观看免费视频精品观看| 欧洲一区二区三区精品| 国产一区清纯| 欧美日韩免费观看一区=区三区| 极品日韩av| 四虎精品永久免费| 久久国产日韩欧美精品| 精品精品久久| 在线天堂资源www在线污| 自由日本语亚洲人高潮| 香蕉久久久久久久av网站| 久热综合在线亚洲精品| 日本综合精品一区| 欧美精品国产一区| 日韩毛片视频| 精品在线播放| 蜜臀国产一区二区三区在线播放 | 国产精品一在线观看| 免费在线观看一区| 久久精品国产999大香线蕉| 99精品电影| 羞羞答答国产精品www一本| 国产精品天天看天天狠| 国产精品久久久久久久久久妞妞| 国产伦理久久久久久妇女| 超碰超碰人人人人精品| 亚洲二区在线| 国产精品最新| 国产理论在线| 久久午夜视频| 国产精品尤物| 欧美男人天堂| 日韩精品久久久久久| 国产精品国产三级在线观看| 欧美69视频| 青草国产精品| 在线一区视频观看| 蜜臀久久99精品久久久画质超高清 | 亚洲1区在线观看| 国产精久久久| 亚洲作爱视频| 国产日韩欧美在线播放不卡| 欧洲av一区二区| 亚洲影视一区二区三区| 国产精品13p| 国产精品美女久久久| 国产精品伊人| 欧美日韩国产亚洲一区| 亚洲精品一二|