推薦(免費(fèi)):mysql視頻教程
記錄學(xué)習(xí)筆記,持續(xù)更新。
優(yōu)化方向
SQL優(yōu)化
- sql優(yōu)化分析
- 索引優(yōu)化
優(yōu)化數(shù)據(jù)庫對(duì)象
- 優(yōu)化表的數(shù)據(jù)類型
- 表拆分(水平、垂直)
- 反范式
- 使用中間表
優(yōu)化 mysql server
- mysql內(nèi)存管理優(yōu)化
- log機(jī)制及優(yōu)化
- 調(diào)整mysql并發(fā)參數(shù)
應(yīng)用優(yōu)化
- 數(shù)據(jù)庫連接池
- 使用緩存減少壓力
- 負(fù)載均衡建立集群
- 主主同步、主從復(fù)制
Mysql優(yōu)化問題分析定位
分析SQL執(zhí)行頻率
show status 例如:分析讀為主,還是寫為主
定位執(zhí)行效率低的SQl
慢查詢?nèi)罩径ㄎ?log-slow-queries = xxx(指定文件名)SHOW PROCESSLIST查看當(dāng)前正在進(jìn)行的線程,包括線程狀態(tài)、是否鎖表
分析SQL執(zhí)行計(jì)劃
explain "your sql"desc "your sql"- 部分參數(shù)分析 select_type: SIMPLE 簡單表,不使用表連接或子查詢PRIMARY 主查詢,即外層的查詢UNION SUBQUER 子查詢的第一個(gè)select type: ALL 全表掃描 index 索引全掃描 range 索引范圍掃描 ref 使用非唯一索引或唯一索引的前綴掃描 eq_ref 類似ref,使用的索引是唯一索引const/system 單表中最多有一個(gè)匹配行NULL 不用訪問表或者索引,直接得到結(jié)果
show profile分析SQL
select @@have_profiling 是否支持 select @@profiling 是否開啟 執(zhí)行 "your sql"show profiles show profile block io for QUERY 17
索引優(yōu)化
索引的存儲(chǔ)分類
B-TREE索引:常見,大部分都支持HASH索引:只有memory引擎支持R-TREE索引:空間索引是MyISAM的一個(gè)特殊索引類型,主要用于地理空間數(shù)據(jù)類型 full-text索引:全文索引,MyISAM的一個(gè)特殊索引類型,innodb從5.6開始支持
索引的創(chuàng)建與刪除
添加索引ALTER Table `table_name` ADD PRIMARY KEY(`column`)ALTER Table `table_name` ADD UNIQUE(`column`)ALTER Table `table_name` ADD INDEX(`column`)ALTER Table `table_name` ADD FULLTEXT(`column`) 刪除ALTER Table `table_name` drop index index_name
Mysql中能使用索引的情況
匹配全值 匹配值范圍查詢 匹配最左前綴 僅僅對(duì)索引進(jìn)行查詢(覆蓋查詢) 匹配列前綴 (添加前綴索引) 部分精確+部分范圍
不能使用索引的場景
以%開關(guān)的like查詢 數(shù)據(jù)類型出現(xiàn)隱式轉(zhuǎn)換 復(fù)合索引查詢條件不包含最左部分 使用索引仍比全表掃描慢 用or分割開的條件
mysql語句優(yōu)化
定期優(yōu)化表
optimize table table_name 合并表空間碎片,對(duì)MyISAM、BDB、INNODB有效 如果提示不支持,可以用 mysql --skip-new 或者 mysql --safe-mode 來重啟,以便讓其他引擎支持
常用優(yōu)化
盡量避免全表掃描,對(duì)where及orderby的列建立索引 盡量避免where使用 != 或 <>盡量避免where子句用 or 連接條件 亂用%導(dǎo)致全表掃描 盡量避免where子句對(duì)字段進(jìn)行表達(dá)式操作 盡量避免where子句對(duì)字段進(jìn)行函數(shù)操作 覆蓋查詢,返回需要的字段 優(yōu)化嵌套查詢,關(guān)聯(lián)查詢優(yōu)于子查詢 組合索引或復(fù)合索引,最左索引原則 用exist代替in當(dāng)索引列有大量重復(fù)數(shù)據(jù)時(shí),SQL查詢可能不會(huì)去利用索引
優(yōu)化數(shù)據(jù)庫對(duì)象
優(yōu)化表數(shù)據(jù)類型
PROCEDURE ANALYSE (16,256) 排除多于16個(gè),大于256字節(jié)的ENUM建議"your sql" PROCEDURE ANALYSE ()
表拆分
垂直拆分 針對(duì)某些列常用、不常用 水平拆分 表很大 表中的數(shù)據(jù)有獨(dú)立性,能簡單分類 需要在表存放多種介質(zhì)
反范式
增加冗余列、增加派生列、重新組表和分割表
使用中間表
數(shù)據(jù)查詢量大 數(shù)據(jù)統(tǒng)計(jì)、分析場景
Mysql引擎比較
mysql有什么引擎?
關(guān)于表引擎的命令
show engines; 查看myql所支持的存儲(chǔ)引擎 show variables like '%storage_engine'; 查看mysql默認(rèn)的存儲(chǔ)引擎 show create table table_name 查看具體表使用的存儲(chǔ)引擎
關(guān)于innodb
1. 提供事務(wù)、回滾、系統(tǒng)奔潰修復(fù)能力、多版本并發(fā)控制事務(wù)2. 支持自增列3. 支持外鍵4. 支持事務(wù)以及事務(wù)相關(guān)聯(lián)功能5. 支持mvcc的行級(jí)鎖
關(guān)于MyISAM
1. 不支持事務(wù)、不支持行級(jí)鎖,只支持并發(fā)插入的表鎖,主要用于高負(fù)載的select2. 支持三種不同的存儲(chǔ)結(jié)構(gòu):靜態(tài)、動(dòng)態(tài)、壓縮
調(diào)整參數(shù)優(yōu)化mysql后臺(tái)服務(wù)
MyISAM內(nèi)存優(yōu)化
#修改相應(yīng)服務(wù)器位置的配置文件 my.cnf key_buffer_size 決定myisam索引塊緩存區(qū)的大小,直接影響表的存取效率,建議1/4可用內(nèi)存 read_buffer 讀緩存 write_buffer 寫緩存
InnoDB內(nèi)存優(yōu)化
innodb_buffer_pool_size 存儲(chǔ)引擎表數(shù)據(jù)和索引數(shù)據(jù)的最大緩存區(qū)大小 innodb_old_blocks_pct LRU算法 決定old sublist的比例 innodb_old_blocks_time LRU算法 數(shù)據(jù)轉(zhuǎn)移間隔時(shí)間
mysql并發(fā)參數(shù)
max_connections 最大連接數(shù),默認(rèn)151back_log 短時(shí)間內(nèi)處理大量連接,可適當(dāng)增大 table_open_cache 控制所有SQL執(zhí)行線程可打開表緩存的數(shù)量,受其他參數(shù)制約 thread_cache_size 控制緩存客戶服務(wù)線程數(shù)量,加快數(shù)據(jù)庫連接速度,根據(jù)threads_created/connections來衡量是否合適 innodb_lock_wait_timeout 控制事務(wù)等待行鎖時(shí)間,默認(rèn)50ms
Mysql應(yīng)用優(yōu)化介紹
為什么要做應(yīng)用優(yōu)化
- 數(shù)據(jù)的重要性
- mysql服務(wù)及自身性能瓶頸
- 保證大型系統(tǒng)穩(wěn)定可靠運(yùn)行
應(yīng)用優(yōu)化方法
-
使用連接池
-
減少對(duì)mysql的真實(shí)連接
a. 避免相同數(shù)據(jù)重復(fù)執(zhí)行(查詢緩存)
b. 使用mysql緩存(sql緩存) -
負(fù)載均衡
a. LVS 分布式
b. 讀寫分離(主主復(fù)制、主從復(fù)制保證數(shù)據(jù)一致性)
數(shù)據(jù)庫連接池
php-cp 擴(kuò)展,僅記錄一下,這種方案可能已過時(shí)
主從備份及讀寫分離
主主備份
負(fù)載均衡
相關(guān)免費(fèi)學(xué)習(xí)推薦:php編程(視頻)
? 版權(quán)聲明
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載。
THE END