這篇文章主要介紹MySQL中優(yōu)化的方法,文中介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們一定要看完!
創(chuàng)新互聯(lián)公司是專業(yè)的和靜網(wǎng)站建設(shè)公司,和靜接單;提供成都做網(wǎng)站、網(wǎng)站設(shè)計(jì),網(wǎng)頁(yè)設(shè)計(jì),網(wǎng)站設(shè)計(jì),建網(wǎng)站,PHP網(wǎng)站建設(shè)等專業(yè)做網(wǎng)站服務(wù);采用PHP框架,可快速的進(jìn)行和靜網(wǎng)站開發(fā)網(wǎng)頁(yè)制作和功能擴(kuò)展;專業(yè)做搜索引擎喜愛的網(wǎng)站,專業(yè)的做網(wǎng)站團(tuán)隊(duì),希望更多企業(yè)前來合作!
sql優(yōu)化分析
索引優(yōu)化
優(yōu)化表的數(shù)據(jù)類型
表拆分(水平、垂直)
反范式
使用中間表
mysql內(nèi)存管理優(yōu)化
log機(jī)制及優(yōu)化
調(diào)整mysql并發(fā)參數(shù)
數(shù)據(jù)庫(kù)連接池
使用緩存減少壓力
負(fù)載均衡建立集群
主主同步、主從復(fù)制
show status 例如:分析讀為主,還是寫為主
慢查詢?nèi)罩径ㄎ?log-slow-queries = xxx(指定文件名)SHOW PROCESSLIST查看當(dāng)前正在進(jìn)行的線程,包括線程狀態(tài)、是否鎖表
explain "your sql"desc "your sql"- 部分參數(shù)分析 select_type: SIMPLE 簡(jiǎn)單表,不使用表連接或子查詢PRIMARY 主查詢,即外層的查詢UNION SUBQUER 子查詢的第一個(gè)select type: ALL 全表掃描 index 索引全掃描 range 索引范圍掃描 ref 使用非唯一索引或唯一索引的前綴掃描 eq_ref 類似ref,使用的索引是唯一索引const/system 單表中最多有一個(gè)匹配行NULL 不用訪問表或者索引,直接得到結(jié)果
select @@have_profiling 是否支持 select @@profiling 是否開啟 執(zhí)行 "your sql"show profiles show profile block io for QUERY 17
B-TREE索引:常見,大部分都支持HASH索引:只有memory引擎支持R-TREE索引:空間索引是MyISAM的一個(gè)特殊索引類型,主要用于地理空間數(shù)據(jù)類型 full-text索引:全文索引,MyISAM的一個(gè)特殊索引類型,innodb從5.6開始支持
添加索引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
匹配全值 匹配值范圍查詢 匹配最左前綴 僅僅對(duì)索引進(jìn)行查詢(覆蓋查詢) 匹配列前綴 (添加前綴索引) 部分精確+部分范圍
以%開關(guān)的like查詢 數(shù)據(jù)類型出現(xiàn)隱式轉(zhuǎn)換 復(fù)合索引查詢條件不包含最左部分 使用索引仍比全表掃描慢 用or分割開的條件
optimize table table_name 合并表空間碎片,對(duì)MyISAM、BDB、INNODB有效 如果提示不支持,可以用 mysql --skip-new 或者 mysql --safe-mode 來重啟,以便讓其他引擎支持
盡量避免全表掃描,對(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ì)去利用索引
PROCEDURE ANALYSE (16,256) 排除多于16個(gè),大于256字節(jié)的ENUM建議"your sql" PROCEDURE ANALYSE ()
垂直拆分 針對(duì)某些列常用、不常用 水平拆分 表很大 表中的數(shù)據(jù)有獨(dú)立性,能簡(jiǎn)單分類 需要在表存放多種介質(zhì)
增加冗余列、增加派生列、重新組表和分割表
數(shù)據(jù)查詢量大 數(shù)據(jù)統(tǒng)計(jì)、分析場(chǎng)景
show engines; 查看myql所支持的存儲(chǔ)引擎 show variables like '%storage_engine'; 查看mysql默認(rèn)的存儲(chǔ)引擎 show create table table_name 查看具體表使用的存儲(chǔ)引擎
1. 提供事務(wù)、回滾、系統(tǒng)奔潰修復(fù)能力、多版本并發(fā)控制事務(wù)2. 支持自增列3. 支持外鍵4. 支持事務(wù)以及事務(wù)相關(guān)聯(lián)功能5. 支持mvcc的行級(jí)鎖
1. 不支持事務(wù)、不支持行級(jí)鎖,只支持并發(fā)插入的表鎖,主要用于高負(fù)載的select2. 支持三種不同的存儲(chǔ)結(jié)構(gòu):靜態(tài)、動(dòng)態(tài)、壓縮
#修改相應(yīng)服務(wù)器位置的配置文件 my.cnf key_buffer_size 決定myisam索引塊緩存區(qū)的大小,直接影響表的存取效率,建議1/4可用內(nèi)存 read_buffer 讀緩存 write_buffer 寫緩存
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í)間
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ù)庫(kù)連接速度,根據(jù)threads_created/connections來衡量是否合適 innodb_lock_wait_timeout 控制事務(wù)等待行鎖時(shí)間,默認(rèn)50ms
數(shù)據(jù)的重要性
mysql服務(wù)及自身性能瓶頸
保證大型系統(tǒng)穩(wěn)定可靠運(yùn)行
使用連接池
減少對(duì)mysql的真實(shí)連接
a. 避免相同數(shù)據(jù)重復(fù)執(zhí)行(查詢緩存)
b. 使用mysql緩存(sql緩存)
負(fù)載均衡
a. LVS 分布式
b. 讀寫分離(主主復(fù)制、主從復(fù)制保證數(shù)據(jù)一致性)
以上是“MySQL中優(yōu)化的方法”這篇文章的所有內(nèi)容,感謝各位的閱讀!希望分享的內(nèi)容對(duì)大家有幫助,更多相關(guān)知識(shí),歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道!