MySQL優化方法

MySQL優化方法

說明

這份文檔由之前的一份PPT修改而成。其內容可能不適用最新版本的MySQL數據庫。數據庫

原則

  1. 80/20 法則
  2. 避免沒必要要的操做
  3. 時空權衡

常見MySQL操做

SELECT+UPDATE 80
INSERT+DELETE 20

 

SELECT 80
UPDATE 20

SELECT 讀鎖
UPDATE 寫鎖

 

MyISAM 表鎖,衝突機率高,併發低
InnoDB 行鎖,衝突機率低,併發高
  • 若是SELECT和UPDATE比較平均,InnoDB性能更好。
  • InnoDB在不使用索引時也會鎖表。
  • 大量使用SELECT COUNT(*)的表不宜採用InnoDB。

查找記錄

  • SELECT * FROM tbl WHERE col1=’xxx’;
  • 全表掃描
  • 表 -> 關係(集合)
  • 行 -> 元素(向量)

Profiling

SET PROFILING=1;
SHOW PROFILES;
SHOW PROFILE FOR QUERY 1;

索引

  • 加速檢索併發

  • 約束 PRIMARY KEY/UNIQUE KEY/FOREIGN KEY性能

  • 單列索引優化

  • 惟一索引 UNIQUE KEYspa

  • 主鍵索引 PRIMARY KEY設計

  • 組合索引排序

組合索引

ALTER TABLE tbl ADD INDEX idx1(a, b, c);

實際上創建了3個索引:索引

(a), (a, b), (a, b, c)

索引生效

a > 5
a = 5 and b > 6
a = 5 and b in (2, 3) and c > 5

索引失效

b > 5
b = 6 and d = 7

索引部分生效

a > 5 and b = 2
a = 5 and b > 6 and c = 2

若是組合索引中,seq_in_index爲N的列上,其查詢條件是開區間(如a>六、a<100等),則seq_in_index大於N的列上的索引失效。文檔

key_len:實際使用的索引的字節數字符串

索引失效緣由

  1. 不是組合索引的最左前綴。
  2. LIKE 以 ‘%’ 開頭。
  3. WHERE col1=123 中,列 col1 是CHAR/VARCHAR/TEXT類型。
  4. ORDER BY 子句混合使用ASC/DESC。
  5. ORDER BY 使用的列和WHERE列不一樣。
  6. 對不一樣的鍵使用 ORDER BY。
  7. 錯誤的使用組合索引。
  8. OFFEST 過大。

索引設計原則

  1. 出如今 WHERE 子句和 JOIN 子句中的列要考慮增長索引。MySQL 實現 JOIN 時會執行內部循環。
  2. 列的值越分散,用做索引時的效率越高。
  3. 字符串使用前綴作索引。
  4. 避免過分索引。

查看索引使用狀況

SHOW STATUS LIKE 'Handler_read%';

 

Handler_read_key 行被索引值讀取的次數
Handler_read_rnd_next 讀取下一行的請求數

SQL語句優化

  1. InnoDB 大量插入數據

    SET UNIQUE_CHECKS = 0;
    SET AUTOCOMMIT = 0;
    -- LOADING DATA
    SET AUTOCOMMIT = 1;
    SET UNIQUE_CHECKS = 1;
  2. 導入數據按主鍵排列。

  3. 將多條INSERT合併:

    INSERT INTO t VALUES (1, 2), (1, 3), ...
  4. 避免 GROUP 引起排序:

    SELECT a, COUNT(*) FROM t GROUP BY a ORDER BY NULL;
  5. 讓 ORDER BY LIMIT 使用索引

    KEY(A, B)
    
    -- 索引生效
    ORDER BY A
    A = 5 ORDER BY B
    ORDER BY A DESC, B DESC
    A > 5 ORDER BY A
    
    -- 索引失效
    ORDER BY B
    A > 5 ORDER BY B
    ORDER BY A ASC, B DESC
  6. 慎用 OFFSET

    SELECT * FROM t LIMIT 10, 20;
    SELECT * FROM t LIMIT 20, OFFSET 10;

Query Cache

SHOW VARIABLES LIKE '%query_cache%';
SHOW STATUS LIKE 'Qcache%';

修訂記錄

  1. 2017年06月19日 根據之前的PPT改寫。
相關文章
相關標籤/搜索