小編給大家分享一下MySQL單表數(shù)據(jù)不要超過500萬行的原因是什么,希望大家閱讀完這篇文章之后都有所收獲,下面讓我們一起去探討吧!
創(chuàng)新互聯(lián)服務(wù)項(xiàng)目包括瑪曲網(wǎng)站建設(shè)、瑪曲網(wǎng)站制作、瑪曲網(wǎng)頁制作以及瑪曲網(wǎng)絡(luò)營銷策劃等。多年來,我們專注于互聯(lián)網(wǎng)行業(yè),利用自身積累的技術(shù)優(yōu)勢、行業(yè)經(jīng)驗(yàn)、深度合作伙伴關(guān)系等,向廣大中小型企業(yè)、政府機(jī)構(gòu)等提供互聯(lián)網(wǎng)行業(yè)的解決方案,瑪曲網(wǎng)站推廣取得了明顯的社會效益與經(jīng)濟(jì)效益。目前,我們服務(wù)的客戶以成都為中心已經(jīng)輻射到瑪曲省份的部分城市,未來相信會繼續(xù)擴(kuò)大服務(wù)區(qū)域并繼續(xù)獲得客戶的支持與信任!
曾經(jīng)在中國互聯(lián)網(wǎng)技術(shù)圈廣為流傳著這么一個說法:MySQL 單表數(shù)據(jù)量大于 2000 萬行,性能會明顯下降。事實(shí)上,這個傳聞?chuàng)f最早起源于百度。具體情況大概是這樣的,當(dāng)年的 DBA 測試 MySQL性能時(shí)發(fā)現(xiàn),當(dāng)單表的量在 2000 萬行量級的時(shí)候,SQL 操作的性能急劇下降,因此,結(jié)論由此而來。然后又據(jù)說百度的工程師流動到業(yè)界的其它公司,也帶去了這個信息,所以,就在業(yè)界流傳開這么一個說法。
再后來,阿里巴巴《Java 開發(fā)手冊》提出單表行數(shù)超過 500 萬行或者單表容量超過 2GB,才推薦進(jìn)行分庫分表。對此,有阿里的黃金鐵律支撐,所以,很多人設(shè)計(jì)大數(shù)據(jù)存儲時(shí),多會以此為標(biāo)準(zhǔn),進(jìn)行分表操作。
那么,你覺得這個數(shù)值多少才合適呢?為什么不是 300 萬行,或者是 800 萬行,而是 500 萬行?也許你會說這個可能就是阿里的最佳實(shí)戰(zhàn)的數(shù)值吧?那么,問題又來了,這個數(shù)值是如何評估出來的呢?稍等片刻,請你小小思考一會兒。
事實(shí)上,這個數(shù)值和實(shí)際記錄的條數(shù)無關(guān),而與 MySQL 的配置以及機(jī)器的硬件有關(guān)。因?yàn)椋琈ySQL 為了提高性能,會將表的索引裝載到內(nèi)存中。InnoDB buffer size 足夠的情況下,其能完成全加載進(jìn)內(nèi)存,查詢不會有問題。但是,當(dāng)單表數(shù)據(jù)庫到達(dá)某個量級的上限時(shí),導(dǎo)致內(nèi)存無法存儲其索引,使得之后的 SQL 查詢會產(chǎn)生磁盤 IO,從而導(dǎo)致性能下降。當(dāng)然,這個還有具體的表結(jié)構(gòu)的設(shè)計(jì)有關(guān),最終導(dǎo)致的問題都是內(nèi)存限制。這里,增加硬件配置,可能會帶來立竿見影的性能提升哈。
那么,我對于分庫分表的觀點(diǎn)是,需要結(jié)合實(shí)際需求,不宜過度設(shè)計(jì),在項(xiàng)目一開始不采用分庫與分表設(shè)計(jì),而是隨著業(yè)務(wù)的增長,在無法繼續(xù)優(yōu)化的情況下,再考慮分庫與分表提高系統(tǒng)的性能。對此,阿里巴巴《Java 開發(fā)手冊》補(bǔ)充到:如果預(yù)計(jì)三年后的數(shù)據(jù)量根本達(dá)不到這個級別,請不要在創(chuàng)建表時(shí)就分庫分表。那么,回到一開始的問題,你覺得這個數(shù)值多少才合適呢?我的建議是,根據(jù)自身的機(jī)器的情況綜合評估,如果心里沒有標(biāo)準(zhǔn),那么暫時(shí)以 500 萬行作為一個統(tǒng)一的標(biāo)準(zhǔn),相對而言算是一個比較折中的數(shù)值。
我們再來看一下關(guān)于SQL書寫的一些注意點(diǎn),會給大家?guī)韼椭?/p>
sql的編寫需要注意優(yōu)化
使用limit對查詢結(jié)果的記錄進(jìn)行限定
避免select *,將需要查找的字段列出來
使用連接(join)來代替子查詢
拆分大的delete或insert語句
可通過開啟慢查詢?nèi)罩緛碚页鲚^慢的SQL
不做列運(yùn)算:SELECT id WHERE age + 1 = 10,任何對列的操作都將導(dǎo)致表掃描,它包括數(shù)據(jù)庫教程函數(shù)、計(jì)算表達(dá)式等等,查詢時(shí)要盡可能將操作移至等號右邊
sql語句盡可能簡單:一條sql只能在一個cpu運(yùn)算;大語句拆小語句,減少鎖時(shí)間;一條大sql可以堵死整個庫
OR改寫成IN:OR的效率是n級別,IN的效率是log(n)級別,in的個數(shù)建議控制在200以內(nèi)
不用函數(shù)和觸發(fā)器,在應(yīng)用程序?qū)崿F(xiàn)
避免%xxx式查詢
少用JOIN
使用同類型進(jìn)行比較,比如用'123'和'123'比,123和123比
盡量避免在WHERE子句中使用!=或<>操作符,否則將引擎放棄使用索引而進(jìn)行全表掃描
對于連續(xù)數(shù)值,使用BETWEEN不用IN:SELECT id FROM t WHERE num BETWEEN 1 AND 5
列表數(shù)據(jù)不要拿全表,要使用LIMIT來分頁,每頁數(shù)量也不要太大
看完了這篇文章,相信你對“MySQL單表數(shù)據(jù)不要超過500萬行的原因是什么”有了一定的了解,如果想了解更多相關(guān)知識,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝各位的閱讀!
網(wǎng)頁題目:MySQL單表數(shù)據(jù)不要超過500萬行的原因是什么
標(biāo)題URL:http://aaarwkj.com/article38/gppcsp.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供、品牌網(wǎng)站制作、網(wǎng)站內(nèi)鏈、網(wǎng)站營銷、做網(wǎng)站、企業(yè)建站
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)