天天看點

mysql的性能優化簡介

mysql性能下降的原因

  • sql語句本身有問題,或沒建索引
  • 索引失效,索引失效的原因本文後面會叙述
  • 關聯了過多的表,可能是前期設計缺陷,或者太奇葩的需求
  • 伺服器調優及參數設定,例如緩沖、線程等

mysql多表連接配接查詢的模式

1. 左表和右表的共有部分,即内連接配接

SELECT fileds

FROM TableA AS A

INNER JOIN TableB AS B

ON A.key1 = B.key2;

2. 左表和右表的共有部分+左表的全部,即左連接配接

LEFT JOIN TableB AS B

3. 左表和右表的共有部分+右表的全部,即右連接配接

RIGHT JOIN TableB AS B

4. 左表獨有的部分

ON  A.key1 = B.key2

WHERE B.key2 IS NULL;

5. 右表獨有的部分

SELECT fields

WHERE A.key1 IS NULL;

6. 左表的全部+右表的全部

mysql不支援full outer join,隻能用union來實作

ON A.key1 = B.key2

UNION

7. 左表獨有的部分+右表獨有的部分,即内連接配接的補集

WHERE B.key2 IS NULL

索引

1. 索引的概念

官方定義:索引是幫助mysql高效擷取資料的資料結構。劃重點:資料結構。在資料之外,資料庫系統還維護了一套滿足特定查找算法的資料結構,這些資料結構以某種方式指向資料,這種資料結構就是索引,可以簡單的了解為"排好序的快速查找資料結構"。索引本身也很大,不可能全部存儲在記憶體,通常以索引檔案的形式存儲在磁盤中。

2. 索引按結構分類及其檢索原理

  • BTree索引
  • Hash索引
  • full-text全文索引
  • R-Tree索引

一般Java開發工程師用到的是BTree索引,或者稱為B樹索引,其檢索原理如下圖所示

mysql的性能優化簡介

如果要查找數字93,在第一層判斷93<100,是以找左邊的指針;在第二層判斷93>80,是以找右邊的指針;在第三層的磁盤塊中找到了存儲的93。B樹索引的縱向層次決定了一次檢索需要幾次IO,是以縱向層次越少,性能越優。一般三層B樹可以處理100萬資料,如果不使用索引,可能需要幾萬到幾十萬次IO,但使用索引隻需要3次。

 3. 索引按字段分類

  • 單值索引:索引隻包含1個列,一個表可以建多個單值索引
  • 複合索引:索引包含多個列
  • 唯一索引:索引列的值必須是唯一的,但允許有空值

4. 建立索引

CREATE [UNIQUE] INDEX indexName ON tableName(columnName);

ALTER TABLE tableName ADD [UNIQUE] INDEX indexName (columnName);

以上兩個語句都可以用于建立索引。其中,indexName是索引名稱,tableName是表名,columnName是列名,如果是多列索引中間用逗号分隔,如果建立的是唯一索引,需要加UNIQUE。

5. 删除索引

DROP INDEX indexName ON tableName;

其中,indexName是索引名稱,tableName是表名,表示删除指定表的指定索引。

6. 檢視索引

SHOW INDEX FROM tableName\G

其中,tableName是表名,\G是為了顯示格式優化。

7. 索引的優勢

  • 提高資料檢索效率,降低資料庫的IO成本
  • 通過索引對資料進行排序,降低CPU消耗

是以,索引有兩個功能,分别作用在WHERE字句和ORDER BY子句上。

8. 索引可能引起的問題

  • 索引也是一張表,儲存了主鍵和索引字段,并指向實體表的記錄
  • 索引提高了讀表速度,卻降低了寫表的速度,因為在進行INSER、DELETE、UPDATE操作時,不僅要儲存資料,還要儲存因更新表帶來的索引資訊變化

索引并不是随便加,也不是越多越好,過多的或者不恰當的索引,反而會降低資料庫的效率,一般一個表不應超過5個索引。

9. 适合建索引的情況

  • 主鍵自動建立唯一索引
  • 連表查詢時,對外連接配接的字段
  • 頻繁用作查詢條件的字段,即WHERE filedName = 'xxx'
  • 需要排序的字段,即ORDER BY fieldName

10. 不适合建索引的情況

  • 頻繁更新的字段,因為每次更新都需要更新索引資訊
  • WHERE子句裡極少用到的字段
  • 表記錄數量太少,一般低于百萬資料的表,建索引意義不大,超過300萬性能才開始下降
  • 資料大量重複且平均分布的字段,建索引意義不大,例如一個字段表示性别,值不是男就是女,且出現的機率差不多,就沒有必要建索引。

關于最後一條,涉及一個概念:索引的選擇性。索引的選擇性是指一個字段的不同的值的數量跟表的記錄數的比值,例如一個字段可能存在8888個值,這個表共有10000條記錄,那麼在這個字段上建的索引的選擇性就是0.8888。索引選擇性越接近1,它的效率就越高。上面提到的"性别"字段,可能存在的值隻有2個,如果這個表有10000條記錄,那麼如果在這個字段上建索引,它的選擇性隻有0.0002。