系统优化怎么做-SQL优化
前言
數(shù)據(jù)庫很重要!很重要!很重要! 重要的事情說三遍。所以單獨用一篇來講述SQL怎么優(yōu)化。不過這里說到一點,不建議在業(yè)務(wù)代碼里寫很多復(fù)雜業(yè)務(wù)SQL,基本盡可能的減少 join,子查詢 等,也就說盡量在應(yīng)用層來解決問題,降低產(chǎn)生低效SQL的概率,數(shù)據(jù)庫只是完成數(shù)據(jù)存儲及最簡單查詢的組件。
SQL優(yōu)化
主要4個方向,以下4個方向盡可能達(dá)到了,SQL的執(zhí)行效率就提高了。
發(fā)現(xiàn)慢SQL
DBA開啟MySQL的慢查詢?nèi)罩?#xff0c;對每日數(shù)據(jù)庫慢查詢進(jìn)行監(jiān)控。慢查詢后每日匯總提供開發(fā)進(jìn)行處理。DBA給出指導(dǎo)意見。
分析執(zhí)行計劃
主要看對SQL的執(zhí)行過程中
得到結(jié)果是
其中 table 表示是哪個表的數(shù)據(jù)。
- type比較重要。表示鏈接的類型。鏈接類型由好到壞的,依次是 system > const > eq_ref > ref > fulltext > ref_or_null > index_merge > unique_subquery > index_subquery > range > index > ALL 一般情況,至少要達(dá)到 range 級別,最好是 ref 級別。否則可能會有性能問題。
- possible_keys 是指可以應(yīng)用到該表的索引,如果為NULL則沒有。
- key 是指用到的索引。
- key_len 是索引的長度,在不影響查詢精度的情況下,值越小越好。
- ref 是指索引的那一列被使用了。一般會是個常數(shù)。
- rows 是指有多少行。
- extra 是指額外的信息。也是比較重要的。如果值為 distinct ,說明mysql 找到了域行聯(lián)合匹配的行,就不再查找了。
SQL優(yōu)化實例
- 分頁查詢
第一種分頁寫法
原理:
一次性根據(jù)過濾條件取出所有字段進(jìn)行排序返回。
數(shù)據(jù)訪問開銷=索引IO + 索引全部記錄結(jié)果對應(yīng)的表數(shù)據(jù)IO
缺點:
該種寫法越翻到后面執(zhí)行效率越差,時間越長,尤其表數(shù)據(jù)量很大的時候。適用場景:當(dāng)中間結(jié)果集很小(10000行以下)或者查詢條件復(fù)雜(指涉及多個不同查詢字段或者多表連接)時適用。
第二種分頁寫法:
select t.* from (select id from twhere thread_id = 771025 and deleted = 0 order by gmt_create asc limit 0, 15) a, t where a.id = t.id;前提:
假設(shè)t表主鍵是id列,且有聯(lián)合索引secondary key:(thread_id, deleted, gmt_create)
原理:
先根據(jù)過濾條件利用聯(lián)合索引取出主鍵id進(jìn)行排序,并內(nèi)部的子查詢只掃描了id字段,而非全表,再進(jìn)行join操作取出其他字段。
數(shù)據(jù)訪問開銷=索引IO+索引分頁后結(jié)果對應(yīng)的表數(shù)據(jù)IO
優(yōu)點:
每次翻頁消耗的資源和時間都基本相同,就像翻第一頁一樣
適用場景:
當(dāng)查詢和排序字段(即where子句和order by子句涉及的字段)有對應(yīng)覆蓋索引時,且中間結(jié)果集很大的情況時適用
- 批量SQL
減少和數(shù)據(jù)庫交互次數(shù)
- 對同一個表的多次alter操作必須合并為一次操作。
mysql對表的修改絕大部分操作都需要鎖表并重建表,而鎖表則會對線上業(yè)務(wù)造成影響。為減少這種影響,必須把對表的多次alter操作合并為一次操作。例如,要給表t增加一個字段b,同時給已有的字段aa建立索引, 通常的做法分為兩步:
然后增加索引:
alter table t add index idx_aa(aa);正確的做法是:
alter table t add column b varchar(10),add index idx_aa(aa);總結(jié)
數(shù)據(jù)庫是有狀態(tài)的服務(wù),變更復(fù)雜而且速度慢,如果把業(yè)務(wù)邏輯放到數(shù)據(jù)庫中,將會限制業(yè)務(wù)的快速發(fā)展。建議把業(yè)務(wù)邏輯提前,放到前端或中間邏輯層,而把數(shù)據(jù)庫作為存儲層,實現(xiàn)邏輯與存儲的分離。
總結(jié)
以上是生活随笔為你收集整理的系统优化怎么做-SQL优化的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 系统优化怎么做-数据库优化
- 下一篇: 系统优化怎么做-Tomcat优化