1、SQL優化
MySQL(三)------MySQL通過explain 命令查看SQL語句執行效率
1、避免select * 寫法
執行SQL時優化器需要將 * 轉成具體的列;每次查詢都要回表,不能走覆蓋索引。
2、避免複雜SQL語句
提升可閱讀性;避免慢查詢的概率;可以轉換成多個短查詢,用業務端處理
3、使用like進行模糊查詢時應避免左模糊查詢
#左模糊查詢會導致全表掃描
select*from table where username like ‘%kewordk%’
4、避免在 where 子句中對字段進行 null 值判斷
導致引擎放棄使用索引而進行全表掃描
select id from t where num is null
最好不要給數據庫留NULL,儘可能的使用 NOT NULL填充數據庫.
5、避免在 where 子句中使用 != 或 <> 操作符
導致引擎放棄使用索引而進行全表掃描。
在mysql數據庫中where 子句中使用 != 或 <> 操作符,引擎不會放棄使用索引。
6、避免在 where 子句中使用 or 來連接條件
如果一個字段有索引,一個字段沒有索引,將導致引擎放棄使用索引而進行全表掃描
7、in 和 not in 也要慎用,否則會導致全表掃描
在mysql數據庫中where 子句中對索引字段使用 in 和 not in操作符,引擎不會放棄使用索引。
在mysql數據庫中where 子句中對不是索引字段使用 in 和 not in操作符,會導致全表掃描。
8、避免在 where 子句中對字段進行表達式操作
導致引擎放棄使用索引而進行全表掃描
select id from t where num/2 = 100
#可以優化爲
select id from t where num = 100*2
9、避免在where子句中對字段進行函數操作
導致引擎放棄使用索引而進行全表掃描
select id from t where substring(name,1,3) = ’abc’
10、 where 及 order by 涉及的列上最好建立索引
對查詢進行優化,要儘量避免全表掃描
11、 where 及 order by 涉及到複合索引字段,應注意順序性
在使用索引字段作爲條件時,如果該索引是複合索引,那麼必須使用到該索引中的第一個字段作爲條件時才能保證系統使用該索引,否則該索引將不會被使用,並且應儘可能的讓字段順序與索引順序相一致。
12、Update 語句,如無必要,不要全修改
如果只更改1、2個字段,不要Update全部字段,否則頻繁調用會引起明顯的性能消耗,同時帶來大量日誌。
13、只需要一條數據時使用LIMIT 1
若已經知道結果只有一條的時候,一定要使用limit 1 ,這樣一來,MySQL在查詢到一條數據之後,會立即停止搜索
2、創建索引
1、索引並不是越多越好
索引固然可以提高相應的 select 的效率,但同時也降低了 insert 及 update 的效率,因爲 insert 或 update 時有可能會重建索引,所以怎樣建索引需要慎重考慮,視具體情況而定。一個表的索引數最好不要超過6個,若太多則應考慮一些不常使用到的列上建的索引是否有 必要。
2、應儘可能的避免更新 clustered 索引數據列
聚集索引(clustered index,也稱聚類索引、簇集索引)和非聚集索引(nonclustered index,也稱非聚類索引、非簇集索引)
聚簇索引的順序就是數據的物理存儲順序,而對非聚簇索引的索引順序與數據物理排列順序無關
聚簇索引的順序就是數據的物理存儲順序,所以一個表最多隻能有一個聚簇索引,因爲物理存儲只能有一個順序
因爲 clustered 索引數據列的順序就是表記錄的物理存儲順序,一旦該列值改變將導致整個表記錄的順序的調整,會耗費相當大的資源。若應用系統需要頻繁更新 clustered 索引數據列,那麼需要考慮是否應將該索引建爲 clustered 索引。
3、數據庫表設計優化
1、數據庫表字段類型
儘量用int型,固定長度用char,使用varchar的範圍儘量貼合實際,能用tinyint就不要用int和smallint,最好給字段設置默認值,默認值不爲null;
2、字段儘量避免空(NULL)
MySQL難以優化了使用了可空列的查詢,它會使索引、索引統計和值更加複雜。
並且可空列需要更多的存儲空間
即使要在表中存儲可爲空的字段,也是有辦法不使用NULL的,可以考慮使用0,特殊值或字符串來代替它。
3、儘量少用text類型,非用不可時最好考慮分表
4、儘量使用數字型字段
若只含數值信息的字段儘量不要設計爲字符型,這會降低查詢和連接的性能,並會增加存儲開銷。這是因爲引擎在處理查詢和連 接時會逐個比較字符串中每一個字符,而對於數字型而言只需要比較一次就夠了。
5、數據庫性能優化,如數據庫配置優化、硬件配置
MySQL常用有兩種存儲引擎,一個是MyISAM,不支持事務處理,讀性能處理快,表級別鎖。另一個是InnoDB,支持事務處理(ACID),設計目標是爲處理大容量數據發揮最大化性能,行級別鎖。
表鎖:開銷小,鎖定粒度大,發生死鎖概率高,相對併發也低。
行鎖:開銷大,鎖定粒度小,發生死鎖概率低,相對併發也高。
根據以上看來,使用InnoDB存儲引擎是最好的選擇,也是MySQL5.5以後版本中默認存儲引擎。
加大物理內存,提高文件系統性能
6、數據庫架構擴展
隨着業務量越來越大,單臺數據庫服務器性能已無法滿足業務需求
1、主從複製與讀寫分離
因爲生產環境中,數據庫大多都是讀操作,所以部署一主多從架構,主數據庫負責寫操作,並做雙擊熱備,多臺從數據庫做負載均衡,負責讀操作
2、分庫、分表
分庫是根據業務不同把相關的表切分到不同的數據庫中,比如web、bbs、blog等庫。如果業務量很大,還可將切分後的庫做主從架構,進一步避免單個庫壓力過大。
數據量的日劇增加,數據庫中某個表有幾百萬條數據,導致查詢和插入耗時太長,怎麼能解決單表壓力呢?你就該考慮是否把這個表拆分成多個小表,來減輕單個表的壓力,提高處理效率,此方式稱爲分表。