MySQL單表三問(wèn)

MySQL單表可以有多少條記錄?

理論上來(lái)說(shuō),MySQL采用不同的存儲(chǔ)引擎斩熊,例如MyISAM和InnoDB,每個(gè)表會(huì)有理論上的存儲(chǔ)記錄上限伐庭,可能取決于主鍵類型(比如采取bigint類型粉渠,最大到18446744073709551615),另外單個(gè)表也有存儲(chǔ)大小上限(InnoDB限制參考https://dev.mysql.com/doc/refman/5.7/en/innodb-limits.html)圾另。但這些理論上限可能還沒(méi)達(dá)到霸株,就達(dá)到了磁盤大小的限制或者操作系統(tǒng)文件大小等限制,比如一個(gè)表10個(gè)字段集乔,平均每個(gè)字段64bytes去件,那么5000萬(wàn)條記錄(甚至遠(yuǎn)未到int的上限)就可能需要占用空間641050000000/1024/1024/1024/=30GB,這些空間還不包含給這個(gè)表建立的索引等占用的空間饺著,10個(gè)這樣的表可能就遠(yuǎn)超300G磁盤空間了箫攀。

那么在實(shí)際應(yīng)用中呢肠牲,網(wǎng)上常有的一個(gè)說(shuō)法是MySQL 單表數(shù)據(jù)量大于 2000 萬(wàn)行幼衰,性能會(huì)明顯下降。據(jù)說(shuō)最早起源于百度缀雳。具體情況大概是這樣的渡嚣,當(dāng)年的 DBA 測(cè)試 MySQL性能時(shí)發(fā)現(xiàn),當(dāng)單表的量在 2000 萬(wàn)行量級(jí)的時(shí)候肥印,SQL 操作的性能急劇下降识椰,阿里巴巴《Java 開(kāi)發(fā)手冊(cè)》提出單表行數(shù)超過(guò) 500 萬(wàn)行或者單表容量超過(guò) 2GB,就可以進(jìn)行分庫(kù)分表 深碱。

一般來(lái)說(shuō)MySQL 為了提高性能腹鹉,會(huì)將表的索引裝載到內(nèi)存中。內(nèi)存等資源足夠的情況下敷硅,其能完成全加載進(jìn)內(nèi)存功咒,查詢不會(huì)有問(wèn)題。但是當(dāng)單表數(shù)據(jù)庫(kù)到達(dá)某個(gè)量級(jí)的上限時(shí)绞蹦,導(dǎo)致內(nèi)存無(wú)法存儲(chǔ)其索引力奋,使得之后的 SQL 查詢會(huì)產(chǎn)生磁盤 IO,從而導(dǎo)致性能下降幽七。當(dāng)然這個(gè)還可能與具體的表結(jié)構(gòu)的設(shè)計(jì)有關(guān)。總之我們?cè)趯?shí)際應(yīng)用過(guò)程中猿挚,可能需要根據(jù)應(yīng)用的需求咐旧,在做好表設(shè)計(jì)的基礎(chǔ)上,硬件資源充分利用的基礎(chǔ)上绩蜻,在數(shù)據(jù)庫(kù)記錄量達(dá)到千萬(wàn)級(jí)甚至數(shù)百萬(wàn)級(jí)別(500萬(wàn))休偶,就可能需要考慮歷史數(shù)據(jù)歸檔,或者分表分庫(kù)了辜羊。這個(gè)數(shù)據(jù)量級(jí)別并不是 MySQL 數(shù)據(jù)庫(kù)的限制踏兜,但數(shù)據(jù)量過(guò)大修改表結(jié)構(gòu),備份八秃,恢復(fù)都可能有很大的問(wèn)題碱妆。但是在項(xiàng)目開(kāi)始階段,不宜過(guò)度設(shè)計(jì)昔驱,立即使用分表分庫(kù)設(shè)計(jì)疹尾。

MySQL單表多少個(gè)字段合適?

實(shí)際上MySQL自身本身也有理論上的限制骤肛,參考MySQL官方文檔:https://dev.mysql.com/doc/refman/5.7/en/column-count-limit.html

但是在實(shí)際應(yīng)用中纳本,一種說(shuō)法是控制單表字段數(shù)量 (1)單表字段數(shù)建議30左右,再多的話考慮垂直分表腋颠,一是冷熱數(shù)據(jù)分離繁成,二是大字段分離,三是常在一起使用的列盡可能放到一個(gè)表中淑玫。 (2)表字段控制少而精巾腕,可以提高IO效率,內(nèi)存緩存更多有效數(shù)據(jù)絮蒿,從而提高響應(yīng)速度和并發(fā)能力尊搬,后續(xù) alter table 也更快。

還有認(rèn)為單張表多少個(gè)字段其實(shí)沒(méi)有什么定論土涝,但是表的單條記錄的大小是有合理空間的佛寿,也就是需要根據(jù)具體硬件和操作系統(tǒng)來(lái)確定單條記錄(row size)的大小:一般來(lái)說(shuō)但壮,現(xiàn)在硬盤的扇區(qū)大小都是4K(有些硬盤可以到16K)冀泻,所以存儲(chǔ)基于操作系統(tǒng)的MySQL單條記錄的合理大小應(yīng)不超過(guò)硬盤的扇區(qū)大小,如果超出意味著查找單條記錄時(shí)需要多個(gè)磁盤扇區(qū)去查找茵肃,增加了尋道時(shí)間腔长,單表數(shù)據(jù)量大了性能會(huì)下降。個(gè)人覺(jué)得設(shè)計(jì)表的時(shí)候验残,重點(diǎn)在于減少磁盤IO捞附,提倡的一個(gè)原則是常在一起使用的列盡可能放到一個(gè)表中,這樣可以避免較多的關(guān)聯(lián)操作。盡量不要違背的一個(gè)原則是包含不必要的大字段鸟召,如果必須胆绊,則考慮下大字段分離,當(dāng)字段涉及到text欧募,blob及其以上的大字段時(shí)压状,查詢操作可能會(huì)涉及到磁盤IO,從而降低性能跟继。參考https://www.cnblogs.com/jpfss/p/10868988.html

MySQL單表可以建立多少個(gè)索引种冬?

索引并不是越多越好,索引可以增加查詢效率舔糖,但同樣也會(huì)降低插入和更新的效率娱两,甚至有些情況下會(huì)降低查詢效率。因?yàn)?MySQL 優(yōu)化器在選擇如何優(yōu)化查詢時(shí)金吗,會(huì)根據(jù)統(tǒng)一信息十兢,對(duì)每一個(gè)可以用到的索引來(lái)進(jìn)行評(píng)估,以生成出一個(gè)最好的執(zhí)行計(jì)劃摇庙,如果同時(shí)有很多個(gè)索引都可以用于查詢旱物,就會(huì)增加 MySQL 優(yōu)化器生成執(zhí)行計(jì)劃的時(shí)間,同樣會(huì)降低查詢性能卫袒。另外索引對(duì)磁盤空間的占用也是成倍增加的

單張表的索引數(shù)量控制在5個(gè)以內(nèi)宵呛,或不超過(guò)表字段個(gè)數(shù)的20%。索引建立應(yīng)遵循的一個(gè)重要原則是:盡量建在選擇性高的列上玛臂。 不在選擇性低的列上建立索引烤蜕,例如性別封孙、類型迹冤。選擇性計(jì)算方法如下:

Selectivity = Cardinality / Total Rows = select count(distinct col)/count(*) from tablename

Selectivity 越接近1說(shuō)明col選擇性越高,使用索引的過(guò)濾效果越好虎忌,如果結(jié)果小于0.2泡徙,則不建議在此列上創(chuàng)建索引,否則可能會(huì)拖慢SQL執(zhí)行膜蠢。

但有一種情況堪藐,idx_feedbackid_type (f_feedback_id,f_type),如果經(jīng)常用 f_type=1 比較挑围,而且能過(guò)濾掉90%行礁竞,那這個(gè)組合索引就值得創(chuàng)建。有時(shí)候同樣的查詢語(yǔ)句杉辙,由于條件取值不同導(dǎo)致使用不同的索引模捂,也是這個(gè)道理。

參考網(wǎng)址:

https://bbs.huaweicloud.com/blogs/129395
https://segmentfault.com/a/1190000039899023
https://dev.mysql.com/doc/refman/8.0/en/optimization.html

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市狂男,隨后出現(xiàn)的幾起案子综看,更是在濱河造成了極大的恐慌,老刑警劉巖岖食,帶你破解...
    沈念sama閱讀 217,734評(píng)論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件红碑,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡泡垃,警方通過(guò)查閱死者的電腦和手機(jī)析珊,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,931評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)蔑穴,“玉大人唾琼,你說(shuō)我怎么就攤上這事∨彀” “怎么了锡溯?”我有些...
    開(kāi)封第一講書人閱讀 164,133評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)哑姚。 經(jīng)常有香客問(wèn)我祭饭,道長(zhǎng),這世上最難降的妖魔是什么叙量? 我笑而不...
    開(kāi)封第一講書人閱讀 58,532評(píng)論 1 293
  • 正文 為了忘掉前任倡蝙,我火速辦了婚禮,結(jié)果婚禮上绞佩,老公的妹妹穿的比我還像新娘寺鸥。我一直安慰自己,他們只是感情好品山,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,585評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布胆建。 她就那樣靜靜地躺著,像睡著了一般肘交。 火紅的嫁衣襯著肌膚如雪笆载。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書人閱讀 51,462評(píng)論 1 302
  • 那天涯呻,我揣著相機(jī)與錄音凉驻,去河邊找鬼。 笑死复罐,一個(gè)胖子當(dāng)著我的面吹牛涝登,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播效诅,決...
    沈念sama閱讀 40,262評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼胀滚,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼咳短!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起蛛淋,我...
    開(kāi)封第一講書人閱讀 39,153評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤咙好,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后褐荷,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體勾效,經(jīng)...
    沈念sama閱讀 45,587評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,792評(píng)論 3 336
  • 正文 我和宋清朗相戀三年叛甫,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了层宫。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,919評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡其监,死狀恐怖萌腿,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情抖苦,我是刑警寧澤毁菱,帶...
    沈念sama閱讀 35,635評(píng)論 5 345
  • 正文 年R本政府宣布,位于F島的核電站锌历,受9級(jí)特大地震影響贮庞,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜究西,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,237評(píng)論 3 329
  • 文/蒙蒙 一窗慎、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧卤材,春花似錦遮斥、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 31,855評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至晕拆,卻和暖如春藐翎,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背实幕。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 32,983評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留堤器,地道東北人昆庇。 一個(gè)月前我還...
    沈念sama閱讀 48,048評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像闸溃,于是被迫代替她去往敵國(guó)和親整吆。 傳聞我的和親對(duì)象是個(gè)殘疾皇子拱撵,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,864評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容

  • MySQL 學(xué)習(xí)筆記(一)[http://www.reibang.com/p/dde13bbe0fd9] MyS...
    Whyn閱讀 483評(píng)論 0 0
  • 在項(xiàng)目中偶爾會(huì)有這種需求,用戶通過(guò)第三方系統(tǒng)登錄時(shí)如果尚未注冊(cè)表蝙,則自動(dòng)給用戶注冊(cè)拴测,注冊(cè)過(guò)的用戶則自動(dòng)登錄,更新最近...
    __七把刀__閱讀 6,125評(píng)論 0 6
  • 優(yōu)化思路 作為架構(gòu)師或者開(kāi)發(fā)人員,說(shuō)到數(shù)據(jù)庫(kù)性能優(yōu)化,你的思路是什么樣的?或者具體一點(diǎn),如果在面試的時(shí)候遇到這個(gè)問(wèn)...
    悠娜的奶爸閱讀 137評(píng)論 0 2
  • 一條查詢 SQL 語(yǔ)句是如何執(zhí)行的? 我們的程序或者工具要操作數(shù)據(jù)庫(kù),第一步要做什么事情?跟數(shù)據(jù)庫(kù)建立連接 通信協(xié)...
    悠娜的奶爸閱讀 313評(píng)論 0 1
  • 我是黑夜里大雨紛飛的人啊 1 “又到一年六月府蛇,有人笑有人哭集索,有人歡樂(lè)有人憂愁,有人驚喜有人失落汇跨,有的覺(jué)得收獲滿滿有...
    陌忘宇閱讀 8,536評(píng)論 28 53