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