mysql配置連接參數(shù)設(shè)置及性能優(yōu)化
1 前言
在java開發(fā)中,最常用的數(shù)據(jù)存儲(chǔ)就是數(shù)據(jù)庫,其中常用的就是mysql,關(guān)于數(shù)據(jù)庫的連接配置信息,可能就不是那么的清除了,這里做一個(gè)配置信息的說明。
2 數(shù)據(jù)庫連接配置信息
jdbc:mysql://localhost:3306/database_name?serverTimezone=Asia/Shanghai&useUnicode=true& characterEncoding=utf8&useSSL=false&tinyInt1isBit=true&allowMultiQueries=true& rewriteBatchedStatements=true&useAffectedRows=true&defaultFetchSize=10000& zeroDateTimeBehavior=convertToNull
3 配置信息說明
- 1、serverTimezone=Asia/Shanghai,即時(shí)區(qū)設(shè)置,上海時(shí)間即東八區(qū),高版本的mysql需要設(shè)置為 GMT%2B8(GMT+8)
- 2、useUnicode=true 使用unicode 編碼
- 3、characterEncoding=utf8 數(shù)據(jù)庫連接字符集
- 4、useSSL=false 是否使用 ssl
- 5、tinyInt1isBit=true 轉(zhuǎn)換為 tinyint(1) 轉(zhuǎn)換為 boolean ,否則為 int
- 6、allowMultiQueries=true 是否允許多行查詢,在批量更新數(shù)據(jù)時(shí),update 語句使用分號(hào)(;)進(jìn)行連接,此時(shí)則需要配置運(yùn)行多行查詢。
- 7、rewriteBatchedStatements=true 批處理時(shí)需要設(shè)置該參數(shù),在mysql5.1.13以上版本才能使用,對(duì) update/insert/delete 都可以生效。數(shù)據(jù)量大時(shí),消耗時(shí)間 jdbc batch < mybatis batch < foreach 循環(huán)。
- 8、useAffectedRows=true,默認(rèn)為false。是否使用影響行數(shù),默認(rèn)為找的所有修改行數(shù),即false。在update 的情況下,更新3條,如果只有兩條有變化,則返回2(useAffectedRows=true),否則返回3.
- 9、defaultFetchSize=10000 默認(rèn)獲取條數(shù)
- 10、zeroDateTimeBehavior=convertToNull 默認(rèn)時(shí)間轉(zhuǎn)換為null,避免轉(zhuǎn)換報(bào)錯(cuò)。0000-00-00 時(shí)間轉(zhuǎn)換為 null
4 數(shù)據(jù)庫sql
# 正常的插入數(shù)據(jù) insert into table_name # 如果數(shù)據(jù)存在則忽略,否則進(jìn)行插入 insert ignore into table_name # 如果數(shù)據(jù)存在則更新 insert into table_name (id,name) values(1,'小明') ON DUPLICATE KEY UPDATE id = 1,name = "xiaoming" # 如果存在則替換 replace into table_name # mysql 還有計(jì)算功能 select 1 + 4 # 計(jì)算結(jié)果為 5 # ifnull 如果字段為空則賦默認(rèn)值為 0 select ifnull(age,0) from table_name # 正則查詢 user_no 不包含 數(shù)字 SELECT * FROM table_name WHERE user_no REGEXP '[^0-9]' # 時(shí)間處理 select DATE_FORMAT(create_time, '%Y%m%d %T'), -- 20210204 12:00:00 id, DATE_FORMAT(create_time, '%Y%m%d%H') as time_str, -- 2021020412 DATE_FORMAT(create_time, '%Y%m%d') as day_str, -- 20210204 DATE_FORMAT(create_time, '%H') as hour_str, -- 12 WEEKDAY(create_time) as week_str -- 0-6,分別是 周一到周日 from table_name
5 mysql 性能優(yōu)化的關(guān)注點(diǎn)
其實(shí),mysql 性能優(yōu)化不是簡(jiǎn)單的知道和使用 explain
和show profile
就天下無敵了,這兩個(gè)只是重要的方面,何況作為資深的CRUD
工程師還未必經(jīng)常使用,任何的知識(shí)都是了解->熟悉->精通
,當(dāng)真正的了解原理或者系統(tǒng)的掌握才是真正的悟道
。接下來開始進(jìn)入正題,mysql
又能優(yōu)化主要為4
個(gè)方面:
- 1 硬件資源和操作系統(tǒng)方面的優(yōu)化
- 2 架構(gòu)設(shè)計(jì)方面的優(yōu)化
- 3
mysql
服務(wù)配置項(xiàng)的優(yōu)化 - 4
sql
執(zhí)行層面的優(yōu)化
6 硬件和操作系統(tǒng)方面的優(yōu)化
硬件和操作系統(tǒng)就是指mysql
服務(wù)所運(yùn)行的服務(wù)器硬件資源情況,影響mysql
性能的主要因素分為 cpu
、內(nèi)存大小、磁盤讀寫速度、網(wǎng)絡(luò)帶寬,硬件是指操作系統(tǒng)的網(wǎng)絡(luò)配置和系統(tǒng)文件句柄數(shù)設(shè)置(linux
系統(tǒng)中,一切皆文件,了解過ES
搭建的同學(xué)都知道,ES
的搭建就需要修改系統(tǒng)最大打開的文件數(shù)) ,這部分的優(yōu)化一般由運(yùn)維工程師和DBA
聯(lián)合完成,在項(xiàng)目開發(fā)伊始,可以根據(jù)業(yè)務(wù)需要承載的數(shù)據(jù)量和 TPS
要求根據(jù)經(jīng)驗(yàn),考慮后續(xù)的業(yè)務(wù)擴(kuò)展性,選擇與業(yè)務(wù)相適配的mysql
服務(wù)。
7 架構(gòu)設(shè)計(jì)方面的優(yōu)化
mysql
是一個(gè)磁盤io
訪問頻繁的關(guān)系型數(shù)據(jù)庫,在高并發(fā)和高性能的應(yīng)用場(chǎng)景中會(huì)承受巨大的壓力,可以采取以下措施來應(yīng)對(duì):
- 1 搭建
mysql
主從集群,單個(gè)mysql
服務(wù)一旦宕機(jī),將會(huì)導(dǎo)致依賴mysql
服務(wù)的應(yīng)用無法響應(yīng)導(dǎo)致服務(wù)不可用,可以采用采用主從集群或者主主集群避免單點(diǎn)故障,保障mysql
服務(wù)的高可用性。 - 2 讀寫分離設(shè)計(jì),在讀多寫少的場(chǎng)景中,可以采用讀寫分離的方案避免讀寫沖突導(dǎo)致的性能問題。
- 3 采用分庫分表的設(shè)計(jì)。通過分庫可以降低單個(gè)
mysql
服務(wù)器的io
壓力,通過分表的機(jī)制可以降低單表數(shù)據(jù)量,提高sql
的查詢效率。 - 4 熱點(diǎn)數(shù)據(jù)引入
Nosql
。引入Redis
或者MongoDB
等非關(guān)系型數(shù)據(jù)庫,可以緩解mysql
的訪問壓力,提升數(shù)據(jù)的檢索性能。
8 mysql 程序配置優(yōu)化。
mysql
配置文件的優(yōu)化,一般通過 mysql
配置文件my.cnf
來設(shè)置。配置項(xiàng)一般包括:
mysql
的最大連接數(shù)max_connections
(注意這里說的不是項(xiàng)目中設(shè)置的數(shù)據(jù)庫連接池的連接數(shù))- 最大的傳輸包(
max_allowed_packet = 16M
) - 開啟
bin log
(默認(rèn)不開啟,主要用在mysql
同步的場(chǎng)景中) general log
(通用日志記錄sql
的執(zhí)行記錄)來記錄日志- 還有就是緩沖區(qū)(
buffer pool
), 包括: 關(guān)聯(lián)查詢緩沖區(qū)join_buffer_size=128M
, 讀數(shù)據(jù)緩沖區(qū)read_buffer_size=16M
,隨機(jī)讀緩沖區(qū)read_rnd_buffer_size=32M
,排序數(shù)據(jù)緩沖區(qū)sort_buffer_size=32M
,innodb
數(shù)據(jù)緩沖區(qū)innodb_buffer_pool_size=4G
。
這些參數(shù)的配置一般和服務(wù)器的資源和使用場(chǎng)景有關(guān),需要根據(jù)實(shí)際情況來設(shè)置。配置項(xiàng)的修改需要關(guān)注兩個(gè)點(diǎn),一是配置的作用范圍,分為會(huì)話級(jí)別和全局范圍,全局參數(shù)對(duì)已經(jīng)存在的會(huì)話不會(huì)生效,會(huì)話參數(shù)設(shè)置只在當(dāng)前會(huì)話生效,會(huì)話結(jié)束則配置失效,全局類的配置放在默認(rèn)的配置文件中,否則服務(wù)重啟將會(huì)失效。第二是否支持熱加載
9 sql 執(zhí)行層面優(yōu)化
sql執(zhí)行層面優(yōu)化的要點(diǎn)如下:
- 1 慢
sql
查詢分析,通過慢sql
查詢?nèi)罩竞吐?code>sql查詢分析工具來定位有問題的sql
列表 - 2 執(zhí)行計(jì)劃。通過
explain 關(guān)鍵字 + 慢 sql
查看當(dāng)前sql
的執(zhí)行計(jì)劃,需要重點(diǎn)關(guān)注select_type、type、 key、 rows、 filterd、 possible_keys
來分析 sql 慢的原因. - 3 使用
show profile
工具來分析,該工具是mysql
提供的分析當(dāng)前會(huì)話中sql
語句資源消耗情況的工具,可以用于sql
調(diào)優(yōu)的測(cè)量,當(dāng)前會(huì)話中默認(rèn)是關(guān)閉的狀態(tài),需要根據(jù)情況打開,默認(rèn)保存最近15
次的分析結(jié)果,針對(duì)慢sql
可以通過show profile
工具來進(jìn)行詳細(xì)分析,得到整個(gè)過程中所以資源的開銷情況,比如io
開銷cpu
開銷和內(nèi)存開銷等情況
10 最終總結(jié)
- 1
sql
的查詢一定要根據(jù)索引來進(jìn)行數(shù)據(jù)掃描 - 2 避免查詢列上使用函數(shù)運(yùn)算或者運(yùn)算符,避免索引失效
- 3
where
條件語句中like %
好盡量放置在右邊 - 4 使用索引掃描,聯(lián)合索引的列從左往右,命中的越多越好
- 5
sql
語句的排序字段盡量是索引字段,否則會(huì)開辟空間進(jìn)行結(jié)果排序 - 6 查詢語句避免使用
*
號(hào),使用需要查詢的列信息即可。 - 7 關(guān)聯(lián)查詢或者子查詢使用小結(jié)果集驅(qū)動(dòng)大結(jié)果集。
到此這篇關(guān)于mysql配置連接參數(shù)設(shè)置及性能優(yōu)化的文章就介紹到這了,更多相關(guān)mysql配置設(shè)置內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
mysql觸發(fā)器實(shí)現(xiàn)oracle物化視圖示例代碼
mysql觸發(fā)器實(shí)現(xiàn)oracle物化視圖即不是基于基表的虛表,而是根據(jù)表實(shí)際存在的實(shí)表,需要的朋友可以參考下2014-02-02mybatis統(tǒng)計(jì)每條SQL的執(zhí)行時(shí)間的方法示例
這篇文章主要介紹了mybatis統(tǒng)計(jì)每條SQL的執(zhí)行時(shí)間的方法示例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-01-01MySQL自定義序列數(shù)的實(shí)現(xiàn)方式
這篇文章主要介紹了MySQL自定義序列數(shù)的實(shí)現(xiàn)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-12-12MySQL數(shù)據(jù)庫基礎(chǔ)篇SQL窗口函數(shù)示例解析教程
這篇文章主要為大家介紹了MySQL數(shù)據(jù)庫基礎(chǔ)篇之窗口函數(shù)示例解析教程,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步2021-10-10