亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 數據庫 > MySQL > 正文

mysql 單機數據庫優化的一些實踐

2024-07-24 13:10:37
字體:
來源:轉載
供稿:網友

數據庫優化有很多可以講,按照支撐的數據量來分可以分為兩個階段:單機數據庫和分庫分表,前者一般可以支撐500W或者10G以內的數據,超過這個值則需要考慮分庫分表。另外,一般大企業面試往往會從單機數據庫問起,一步一步問到分庫分表,中間會穿插很多數據庫優化的問題。本文試圖描述單機數據庫優化的一些實踐,數據庫基于mysql,如有不合理的地方,歡迎指正。

單機數據庫優化,mysql,數據庫優化,優化

1、表結構優化

在開始做一個應用的時候,數據庫的表結構設計往往會影響應用后期的性能,特別是用戶量上來了以后的性能。因此,表結構優化是一個很重要的步驟。

1.1、字符集

一般來說盡量選擇UTF-8,雖然在存中午的時候GBK比UTF-8使用的存儲空間少,但是UTF-8兼容各國語言,其實我們不必為了這點存儲空間而犧牲了擴展性。事實上,后期如果要從GBK轉為UTF-8所要付出的代價是很高的,需要進行數據遷移,而存儲空間完全可以用花錢擴充硬盤來解決。

1.2、主鍵

在使用mysql的innodb的時候,innodb的底層存儲模型是B+樹,它使用主鍵作為聚簇索引,使用插入的數據作為葉子節點,通過主鍵可以很快找到葉子節點,從而快速獲取記錄。因此在設計表的時候需要增加一個主鍵,而且最好要自增。因為自增主鍵可以讓插入的數據按主鍵順序插入到底層的B+樹的葉子節點中,由于是按序的,這種插入幾乎不需要去移動已有的其它數據,所以插入效率很高。如果主鍵不是自增的,那么每次主鍵的值近似隨機,這時候就有可能需要移動大量數據來保證B+樹的特性,增加了不必要的開銷。

1.3、字段

1.3.1、建了索引的字段必須加上not null約束,并且設置default值

1.3.2、不建議使用float、double來存小數,防止精度損失,建議使用decimal

1.3.3、不建議使用Text/blob來保存大量數據,因為對大文本的讀寫會造成比較大的I/O開銷,同時占用mysql的緩存,高并發下會極大的降低數據庫的吞吐量,建議將大文本數據保存在專門的文件存儲系統中,mysql中只保存這個文件的訪問地址,比如博客文章可以保存在文件中,mysql中只保存文件的相對地址。

1.3.4、varchar類型長度建議不要超過8K。

1.3.5、時間類型建議使用Datetime,不要使用timestamp,雖然Datetime占用8個字節,而timestamp只占用4個字節,但是后者要保證非空,而且后者是對時區敏感的。

1.3.6、建議表中增加gmt_create和gmt_modified兩個字段,用來記錄數據創建的修改時間。這兩個字段建立的原因是方便查問題。

1.4、索引創建

1.4.1、這個階段由于對業務并不了解,所以盡量不要盲目加索引,只為一些一定會用到索引的字段加普通索引。

1.4.2、創建innodb單列索引的長度不要超過767bytes,如果超過會用前255bytes作為前綴索引

1.4.3、創建innodb組合索引的各列索引長度不要超過767bytes,一共加起來不要超過3072bytes

2、SQL優化

一般來說sql就那么幾種:基本的增刪改查,分頁查詢,范圍查詢,模糊搜索,多表連接

2.1、基本查詢

一般查詢需要走索引,如果沒有索引建議修改查詢,把有索引的那個字段加上,如果由于業務場景沒法使用這個字段,那么需要看這個查詢調用量大不大,如果大,比如每天調用10W+,這就需要新增索引,如果不大,比如每天調用100+,則可以考慮保持原樣。另外,select * 盡量少用,用到什么字段就在sql語句中加什么,不必要的字段就別查了,浪費I/O和內存空間。

2.2、高效分頁

limit m,n其實質就是先執行limit m+n,然后從第m行取n行,這樣當limit翻頁越往后翻m越大,性能越低。比如

select * from A limit 100000,10,這種sql語句的性能是很差的,建議改成下面的版本:

selec id,name,age from A where id >=(select id from A limit 100000,1) limit 10

2.3、范圍查詢

范圍查詢包括between、大于、小于以及in。Mysql中的in查詢的條件有數量的限制,若數量較小可以走索引查詢,若數量較大,就成了全表掃描了。而between、大于、小于等,這些查詢不會走索引,所以盡量放在走索引的查詢條件之后。

2.4、模糊查詢like

使用 like %name%這樣的語句是不會走索引的,相當于全表掃描,數據量小的時候不會有太大的問題,數據量大了以后性能會下降的很厲害,建議數據量大了以后使用搜索引擎來代替這種模糊搜索,實在不行也要在模糊查詢前加個能走索引的條件。

2.5、多表連接

子查詢和join都可以實現在多張表之間取數據,但是子查詢性能較差,建議將子查詢改成join。對于mysql的join,它用的是Nested Loop Join算法,也就是通過前一個表查詢的結果集去后一個表中查詢,比如前一個表的結果集是100條數據,后一個表有10W數據,那么就需要在100*10W的數據集合中去過濾得到最終的結果集。因此,盡量用小結果集的表去和大表做join,同時在join的字段上建立索引,如果建不了索引,就需要設置足夠大的join buffer size。如果以上的技巧都無法解決join所帶來的性能下降的問題,那干脆就別用join了,將一次join查詢拆分成兩次簡單查詢。另外,多表連接盡量不要超過三張表,超過三張表一般來說性能會很差,建議拆分sql。

3、數據庫連接池優化

數據庫連接池本質上是一種緩存,它是一種抗高并發的手段。數據庫連接池優化主要是對參數進行優化,一般我們使用DBCP連接池,它的具體參數如下:

3.1  initialSize

初始連接數,這里的初始指的是第一次getConnection的時候,而不是應用啟動的時候。初始值可以設置為并發量的歷史平均值

3.2、minIdle

最小保留的空閑連接數。DBCP會在后臺開啟一個回收空閑連接的線程,當該線程進行空閑連接回收的時候,會保留minIdle個連接數。一般設置為5,并發量實在很小可以設置為1.

3.3、maxIdle

最大保留的空閑連接數,按照業務并發高峰設置。比如并發高峰為20,那么當高峰過去后,這些連接不會馬上被回收,如果過一小段時間又來一個高峰,那么連接池就可以復用這些空閑連接而不需要頻繁創建和關閉連接。

3.4、maxActive

最大活躍連接數,按照可以接受的并發極值設置。比如單機并發量可接受的極值是100,那么這個maxActive設置成100后,就只能同時為100個請求服務,多余的請求會在最大等待時間之后被拋棄。這個值必須設置,可以防止惡意的并發攻擊,保護數據庫。

3.5、maxWait

獲取連接的最大等待時間,建議設置的短一點,比如3s,這樣可以讓請求快速失敗,因為一個請求在等待獲取連接的時候,線程是不可以被釋放的,而單機的線程并發量是有限的,如果這個時間設置的過長,比如網上建議的60s,那么這個線程在這60s內是無法被釋放的,只要這種請求一多,應用的可用線程就少了,服務就變得不可用了。

3.6、minEvictableIdleTimeMillis

連接保持空閑而不被回收的時間,默認30分鐘。

3.7、validationQuery

用于檢測連接是否有效的sql語句,一般是一條簡單的sql,建議設置

3.8、testOnBorrow

申請連接的時候對連接進行檢測,不建議開啟,嚴重影響性能

3.9、testOnReturn

歸還連接的時候對連接進行檢測,不建議開啟,嚴重影響性能

3.10、testWhileIdle

開啟了以后,后臺清理連接的線程會沒隔一段時間對空閑連接進行validateObject,如果連接失效則會進行清除,不影響性能,建議開啟

3.11、numTestsPerEvictionRun

代表每次檢查鏈接的數量,建議設置和maxActive一樣大,這樣每次可以有效檢查所有的鏈接。

3.12、預熱連接池

對于連接池,建議在啟動應用的時候進行預熱,在還未對外提供訪問之前進行簡單的sql查詢,讓連接池充滿必要的連接數。

4、索引優化

當數據量增加到一定程度后,靠sql優化已經無法提升性能了,這時候就需要祭出大招:索引。索引有三級,一般來說掌握這三級就足夠了,另外,對于建立索引的字段,需要考慮其選擇性。

4.1、一級索引

在where后面的條件上建立索引,單列可以建立普通索引,多列則建立組合索引。組合索引需要注意最左前綴原則。

4.2、二級索引

如果有被order by或者group by用到的字段,則可以考慮在這個字段上建索引,這樣一來,由于索引天然有序,可以避免order by以及group by所帶來的排序,從而提高性能。

4.3、三級索引

如果上面兩招還不行,那么就把所查詢的字段也加上索引,這時候就形成了所謂的索引覆蓋,這樣做可以減少一次I/O操作,因為mysql在查詢數據的時候,是先查主鍵索引,然后根據主鍵索引去查普通索引,然后根據普通索引去查相對應的記錄。如果我們所需要的記錄在普通索引里都有,那就不需要第三步了。當然,這種建索引的方式比較極端,不適合一般場景。

4.4、索引的選擇性

在建立索引的時候,盡量在選擇性高的字段上建立。什么是選擇性高呢?所謂選擇性高就是通過這個字段查出來的數據量少,比如按照名字查一個人的信息,查出來的數據量一般會很少,而按照性別查則可能會把數據庫一半的數據都查出來,所以,名字是一個選擇性高的字段,而性別是個選擇性低的字段。

5、歷史數據歸檔

當數據量到了一年增加500W條的時候,索引也無能為力,這時候一般的思路都是考慮分庫分表。如果業務沒有爆發式增長,但是數據的確在緩慢增加,則可以不考慮分庫分表這種復雜的技術手段,而是進行歷史數據歸檔。我們針對生命周期已經完結的歷史數據,比如6個月之前的數據,進行歸檔。我們可以使用quartz的調度任務在凌晨定時將6個月之前的數據查出來,然后存入遠程的hbase服務器。當然,我們也需要提供歷史數據的查詢接口,以備不時之需。

以上就是對mysql 單機數據庫的優化資料整理,后續繼續補充相關資料,謝謝大家對本站的支持!


注:相關教程知識閱讀請移步到MYSQL教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
中文字幕在线视频日韩| 国产一区二中文字幕在线看| 日韩欧美国产一区二区| 51精品国产黑色丝袜高跟鞋| 日韩精品在线影院| 欧美一区二区三区艳史| 国外成人在线直播| 国产日韩欧美中文在线播放| 一区二区国产精品视频| 国产精彩精品视频| 欧美裸体xxxxx| 国产日韩亚洲欧美| 91国产视频在线播放| 亚洲女同性videos| 国产精品一区二区三区久久久| 欧美理论电影在线观看| 国产日韩欧美夫妻视频在线观看| 久久免费精品日本久久中文字幕| 国产日韩精品电影| 亚洲一区二区三区777| 色婷婷综合久久久久| 久久av资源网站| 高清欧美性猛交xxxx黑人猛交| 热re99久久精品国产66热| 最近中文字幕mv在线一区二区三区四区| 日韩av电影中文字幕| 97精品在线视频| 91免费精品视频| 日本午夜在线亚洲.国产| 国产精品视频区| 亚洲精品乱码久久久久久按摩观| 亚洲成人激情在线观看| 久久久国产一区| 亚洲天堂av综合网| 亚洲一区久久久| 亚洲精品一区二区三区不| 亚洲午夜久久久影院| 久久亚洲一区二区三区四区五区高| 久久久久久中文字幕| 国产亚洲精品久久久优势| 96sao精品视频在线观看| 亚洲精品成人网| 亚州欧美日韩中文视频| 亚洲精品成人av| 亚洲男人天堂久| 韩国视频理论视频久久| 中文字幕精品久久久久| 久久亚洲精品小早川怜子66| 欧洲亚洲免费视频| 97色在线视频观看| 中文字幕亚洲二区| 奇米四色中文综合久久| 国产精品久久久久久久久久新婚| 97免费视频在线播放| 日韩国产欧美精品一区二区三区| 亚洲理论电影网| 中文国产成人精品久久一| 亚洲日韩中文字幕在线播放| 在线日韩日本国产亚洲| 欧美做爰性生交视频| 亚洲精品永久免费精品| 国产视频丨精品|在线观看| 亚洲а∨天堂久久精品喷水| 国产精品h在线观看| 91精品久久久久久久久久久久久| 黄色成人av在线| 亚洲嫩模很污视频| 日韩在线免费观看视频| 欧美最顶级丰满的aⅴ艳星| 国产精品久久久久不卡| 欧美亚洲另类视频| 久久99精品久久久久久噜噜| 国产精品视频网址| 亚洲视频国产视频| 91亚洲国产精品| 久久91精品国产91久久跳| 精品日韩中文字幕| 国产v综合v亚洲欧美久久| 日韩中文字幕视频在线观看| 91av在线播放| 欧美成人亚洲成人| 精品久久久久久久久中文字幕| 成人免费网站在线| 九九久久久久久久久激情| 中文字幕免费精品一区高清| 狠狠操狠狠色综合网| 日韩中文字幕在线播放| 91av在线播放视频| 茄子视频成人在线| 欧美日韩一二三四五区| 黄网站色欧美视频| 日产精品99久久久久久| 国产精品吊钟奶在线| 欧美精品在线极品| 欧美电影免费观看网站| 欧美日韩国产成人| 午夜精品理论片| 这里精品视频免费| 国内精品小视频| 久久精品视频中文字幕| 懂色av中文一区二区三区天美| 欧美激情乱人伦一区| 欧美午夜性色大片在线观看| 日韩av在线播放资源| 亚洲成人黄色在线| 欧美xxxx18国产| 日韩精品www| 日韩在线中文视频| 欧美成人亚洲成人日韩成人| 中文字幕精品网| 91伊人影院在线播放| 日韩成人在线视频| 国产精品一区二区三区毛片淫片| 日韩经典中文字幕| 亚洲欧美另类国产| 97精品视频在线观看| wwwwwwww亚洲| 国产精品女主播视频| 午夜精品一区二区三区av| 亚洲国产精品推荐| 欧美日韩国产999| 欧美日韩中文字幕综合视频| 欧美性受xxxx白人性爽| 国产精品jvid在线观看蜜臀| 久久久久久久国产| 91免费人成网站在线观看18| 久国内精品在线| 韩国日本不卡在线| 中国china体内裑精亚洲片| 国产精品一区二区久久久| 欧美性猛交xxxx黑人| 91精品国产91| 国产精品免费久久久| 久久精品美女视频网站| 国产成人综合久久| 欧美精品videosex牲欧美| 久久国产精品首页| 欧美亚洲另类在线| 成人午夜在线影院| 一区二区三区四区精品| 九九精品视频在线观看| xvideos国产精品| 91极品视频在线| 国产欧亚日韩视频| 久久久免费高清电视剧观看| www.日韩免费| 久热99视频在线观看| 精品精品国产国产自在线| 欧美一区二区三区免费视| 亚洲欧美另类人妖| 亚洲国产欧美一区二区三区久久| 国产成人综合精品在线| 亚洲全黄一级网站| 亚洲人a成www在线影院| 深夜福利一区二区| 欧美性jizz18性欧美| 亚洲精品aⅴ中文字幕乱码| 亚洲成人精品视频在线观看| 欧美日韩亚洲精品一区二区三区| 91九色国产在线| 奇米一区二区三区四区久久| 亚洲精品国产精品国产自| 欧美诱惑福利视频| 成人免费淫片aa视频免费|