1. 程式人生 > >MySQL 效能優化神器 Explain 使用分析

MySQL 效能優化神器 Explain 使用分析

簡介

MySQL 提供了一個 EXPLAIN 命令, 它可以對 SELECT 語句進行分析, 並輸出 SELECT 執行的詳細資訊, 以供開發人員針對性優化.
EXPLAIN 命令用法十分簡單, 在 SELECT 語句前加上 Explain 就可以了, 例如:

EXPLAIN SELECT * from user_info WHERE id < 300;

準備

為了接下來方便演示 EXPLAIN 的使用, 首先我們需要建立兩個測試用的表, 並新增相應的資料:

CREATE TABLE `user_info` (
  `id`   BIGINT(20)  NOT NULL AUTO_INCREMENT,
  `name` VARCHAR(50) NOT NULL DEFAULT '',
  `age`  INT(11)              DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `name_index` (`name`)
)
  ENGINE = InnoDB
  DEFAULT CHARSET = utf8

INSERT INTO user_info (name, age) VALUES ('xys', 20);
INSERT INTO user_info (name, age) VALUES ('a', 21);
INSERT INTO user_info (name, age) VALUES ('b', 23);
INSERT INTO user_info (name, age) VALUES ('c', 50);
INSERT INTO user_info (name, age) VALUES ('d', 15);
INSERT INTO user_info (name, age) VALUES ('e', 20);
INSERT INTO user_info (name, age) VALUES ('f', 21);
INSERT INTO user_info (name, age) VALUES ('g', 23);
INSERT INTO user_info (name, age) VALUES ('h', 50);
INSERT INTO user_info (name, age) VALUES ('i', 15);
CREATE TABLE `order_info` (
  `id`           BIGINT(20)  NOT NULL AUTO_INCREMENT,
  `user_id`      BIGINT(20)           DEFAULT NULL,
  `product_name` VARCHAR(50) NOT NULL DEFAULT '',
  `productor`    VARCHAR(30)          DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `user_product_detail_index` (`user_id`, `product_name`, `productor`)
)
  ENGINE = InnoDB
  DEFAULT CHARSET = utf8

INSERT INTO order_info (user_id, product_name, productor) VALUES (1, 'p1', 'WHH');
INSERT INTO order_info (user_id, product_name, productor) VALUES (1, 'p2', 'WL');
INSERT INTO order_info (user_id, product_name, productor) VALUES (1, 'p1', 'DX');
INSERT INTO order_info (user_id, product_name, productor) VALUES (2, 'p1', 'WHH');
INSERT INTO order_info (user_id, product_name, productor) VALUES (2, 'p5', 'WL');
INSERT INTO order_info (user_id, product_name, productor) VALUES (3, 'p3', 'MA');
INSERT INTO order_info (user_id, product_name, productor) VALUES (4, 'p1', 'WHH');
INSERT INTO order_info (user_id, product_name, productor) VALUES (6, 'p1', 'WHH');
INSERT INTO order_info (user_id, product_name, productor) VALUES (9, 'p8', 'TE');

EXPLAIN 輸出格式

EXPLAIN 命令的輸出內容大致如下:

mysql> explain select * from user_info where id = 2\G
*************************** 1. row ***************************
           id: 1
  select_type: SIMPLE
        table: user_info
   partitions: NULL
         type: const
possible_keys: PRIMARY
          key: PRIMARY
      key_len: 8
          ref: const
         rows: 1
     filtered: 100.00
        Extra: NULL
1 row in set, 1 warning (0.00 sec)

各列的含義如下:

  • id: SELECT 查詢的識別符號. 每個 SELECT 都會自動分配一個唯一的識別符號.

  • select_type: SELECT 查詢的型別.

  • table: 查詢的是哪個表

  • partitions: 匹配的分割槽

  • type: join 型別

  • possible_keys: 此次查詢中可能選用的索引

  • key: 此次查詢中確切使用到的索引.

  • ref: 哪個欄位或常數與 key 一起被使用

  • rows: 顯示此查詢一共掃描了多少行. 這個是一個估計值.

  • filtered: 表示此查詢條件所過濾的資料的百分比

  • extra: 額外的資訊

接下來我們來重點看一下比較重要的幾個欄位.

select_type

select_type 表示了查詢的型別, 它的常用取值有:

  • SIMPLE, 表示此查詢不包含 UNION 查詢或子查詢

  • PRIMARY, 表示此查詢是最外層的查詢

  • UNION, 表示此查詢是 UNION 的第二或隨後的查詢

  • DEPENDENT UNION, UNION 中的第二個或後面的查詢語句, 取決於外面的查詢

  • UNION RESULT, UNION 的結果

  • SUBQUERY, 子查詢中的第一個 SELECT

  • DEPENDENT SUBQUERY: 子查詢中的第一個 SELECT, 取決於外面的查詢. 即子查詢依賴於外層查詢的結果.

最常見的查詢類別應該是 SIMPLE 了, 比如當我們的查詢沒有子查詢, 也沒有 UNION 查詢時, 那麼通常就是 SIMPLE 型別, 例如:

mysql> explain select * from user_info where id = 2\G
*************************** 1. row ***************************
           id: 1
  select_type: SIMPLE
        table: user_info
   partitions: NULL
         type: const
possible_keys: PRIMARY
          key: PRIMARY
      key_len: 8
          ref: const
         rows: 1
     filtered: 100.00
        Extra: NULL
1 row in set, 1 warning (0.00 sec)

如果我們使用了 UNION 查詢, 那麼 EXPLAIN 輸出 的結果類似如下:

mysql> EXPLAIN (SELECT * FROM user_info  WHERE id IN (1, 2, 3))
    -> UNION
    -> (SELECT * FROM user_info WHERE id IN (3, 4, 5));
+----+--------------+------------+------------+-------+---------------+---------+---------+------+------+----------+-----------------+
| id | select_type  | table      | partitions | type  | possible_keys | key     | key_len | ref  | rows | filtered | Extra           |
+----+--------------+------------+------------+-------+---------------+---------+---------+------+------+----------+-----------------+
|  1 | PRIMARY      | user_info  | NULL       | range | PRIMARY       | PRIMARY | 8       | NULL |    3 |   100.00 | Using where     |
|  2 | UNION        | user_info  | NULL       | range | PRIMARY       | PRIMARY | 8       | NULL |    3 |   100.00 | Using where     |
| NULL | UNION RESULT | <union1,2> | NULL       | ALL   | NULL          | NULL    | NULL    | NULL | NULL |     NULL | Using temporary |
+----+--------------+------------+------------+-------+---------------+---------+---------+------+------+----------+-----------------+
3 rows in set, 1 warning (0.00 sec)

table

表示查詢涉及的表或衍生表

type

type 欄位比較重要, 它提供了判斷查詢是否高效的重要依據依據. 通過 type 欄位, 我們判斷此次查詢是 全表掃描 還是 索引掃描 等.

type 常用型別

type 常用的取值有:

  • system: 表中只有一條資料. 這個型別是特殊的 const 型別.

  • const: 針對主鍵或唯一索引的等值查詢掃描, 最多隻返回一行資料. const 查詢速度非常快, 因為它僅僅讀取一次即可.
    例如下面的這個查詢, 它使用了主鍵索引, 因此 type 就是 const 型別的.

mysql> explain select * from user_info where id = 2\G
*************************** 1. row ***************************
           id: 1
  select_type: SIMPLE
        table: user_info
   partitions: NULL
         type: const
possible_keys: PRIMARY
          key: PRIMARY
      key_len: 8
          ref: const
         rows: 1
     filtered: 100.00
        Extra: NULL
1 row in set, 1 warning (0.00 sec)
  • eq_ref: 此型別通常出現在多表的 join 查詢, 表示對於前表的每一個結果, 都只能匹配到後表的一行結果. 並且查詢的比較操作通常是 =, 查詢效率較高. 例如:

mysql> EXPLAIN SELECT * FROM user_info, order_info WHERE user_info.id = order_info.user_id\G
*************************** 1. row ***************************
           id: 1
  select_type: SIMPLE
        table: order_info
   partitions: NULL
         type: index
possible_keys: user_product_detail_index
          key: user_product_detail_index
      key_len: 314
          ref: NULL
         rows: 9
     filtered: 100.00
        Extra: Using where; Using index
*************************** 2. row ***************************
           id: 1
  select_type: SIMPLE
        table: user_info
   partitions: NULL
         type: eq_ref
possible_keys: PRIMARY
          key: PRIMARY
      key_len: 8
          ref: test.order_info.user_id
         rows: 1
     filtered: 100.00
        Extra: NULL
2 rows in set, 1 warning (0.00 sec)
  • ref: 此型別通常出現在多表的 join 查詢, 針對於非唯一或非主鍵索引, 或者是使用了 最左字首 規則索引的查詢. 
    例如下面這個例子中, 就使用到了 ref 型別的查詢:

mysql> EXPLAIN SELECT * FROM user_info, order_info WHERE user_info.id = order_info.user_id AND order_info.user_id = 5\G
*************************** 1. row ***************************
           id: 1
  select_type: SIMPLE
        table: user_info
   partitions: NULL
         type: const
possible_keys: PRIMARY
          key: PRIMARY
      key_len: 8
          ref: const
         rows: 1
     filtered: 100.00
        Extra: NULL
*************************** 2. row ***************************
           id: 1
  select_type: SIMPLE
        table: order_info
   partitions: NULL
         type: ref
possible_keys: user_product_detail_index
          key: user_product_detail_index
      key_len: 9
          ref: const
         rows: 1
     filtered: 100.00
        Extra: Using index
2 rows in set, 1 warning (0.01 sec)
  • range: 表示使用索引範圍查詢, 通過索引欄位範圍獲取表中部分資料記錄. 這個型別通常出現在 =, <>, >, >=, <, <=, IS NULL, <=>, BETWEEN, IN() 操作中.
    當 type 是 range 時, 那麼 EXPLAIN 輸出的 ref 欄位為 NULL, 並且 key_len 欄位是此次查詢中使用到的索引的最長的那個.

例如下面的例子就是一個範圍查詢:

mysql> EXPLAIN SELECT *
    ->         FROM user_info
    ->         WHERE id BETWEEN 2 AND 8 \G
*************************** 1. row ***************************
           id: 1
  select_type: SIMPLE
        table: user_info
   partitions: NULL
         type: range
possible_keys: PRIMARY
          key: PRIMARY
      key_len: 8
          ref: NULL
         rows: 7
     filtered: 100.00
        Extra: Using where
1 row in set, 1 warning (0.00 sec)
  • index: 表示全索引掃描(full index scan), 和 ALL 型別類似, 只不過 ALL 型別是全表掃描, 而 index 型別則僅僅掃描所有的索引, 而不掃描資料.
    index 型別通常出現在: 所要查詢的資料直接在索引樹中就可以獲取到, 而不需要掃描資料. 當是這種情況時, Extra 欄位 會顯示 Using index.

例如:

mysql> EXPLAIN SELECT name FROM  user_info \G
*************************** 1. row ***************************
           id: 1
  select_type: SIMPLE
        table: user_info
   partitions: NULL
         type: index
possible_keys: NULL
          key: name_index
      key_len: 152
          ref: NULL
         rows: 10
     filtered: 100.00
        Extra: Using index
1 row in set, 1 warning (0.00 sec)

上面的例子中, 我們查詢的 name 欄位恰好是一個索引, 因此我們直接從索引中獲取資料就可以滿足查詢的需求了, 而不需要查詢表中的資料. 因此這樣的情況下, type 的值是 index, 並且 Extra 的值是 Using index.

  • ALL: 表示全表掃描, 這個型別的查詢是效能最差的查詢之一. 通常來說, 我們的查詢不應該出現 ALL 型別的查詢, 因為這樣的查詢在資料量大的情況下, 對資料庫的效能是巨大的災難. 如一個查詢是 ALL 型別查詢, 那麼一般來說可以對相應的欄位新增索引來避免.
    下面是一個全表掃描的例子, 可以看到, 在全表掃描時, possible_keys 和 key 欄位都是 NULL, 表示沒有使用到索引, 並且 rows 十分巨大, 因此整個查詢效率是十分低下的.

mysql> EXPLAIN SELECT age FROM  user_info WHERE age = 20 \G
*************************** 1. row ***************************
           id: 1
  select_type: SIMPLE
        table: user_info
   partitions: NULL
         type: ALL
possible_keys: NULL
          key: NULL
      key_len: NULL
          ref: NULL
         rows: 10
     filtered: 10.00
        Extra: Using where
1 row in set, 1 warning (0.00 sec)

type 型別的效能比較

通常來說, 不同的 type 型別的效能關係如下:
ALL < index < range ~ index_merge < ref < eq_ref < const < system
ALL 型別因為是全表掃描, 因此在相同的查詢條件下, 它是速度最慢的.
而 index 型別的查詢雖然不是全表掃描, 但是它掃描了所有的索引, 因此比 ALL 型別的稍快.
後面的幾種型別都是利用了索引來查詢資料, 因此可以過濾部分或大部分資料, 因此查詢效率就比較高了.

possible_keys

possible_keys 表示 MySQL 在查詢時, 能夠使用到的索引. 注意, 即使有些索引在 possible_keys 中出現, 但是並不表示此索引會真正地被 MySQL 使用到. MySQL 在查詢時具體使用了哪些索引, 由 key 欄位決定.

key

此欄位是 MySQL 在當前查詢時所真正使用到的索引.

key_len

表示查詢優化器使用了索引的位元組數. 這個欄位可以評估組合索引是否完全被使用, 或只有最左部分欄位被使用到.
key_len 的計算規則如下:

  • 字串

    • char(n): n 位元組長度

    • varchar(n): 如果是 utf8 編碼, 則是 3 n + 2位元組; 如果是 utf8mb4 編碼, 則是 4 n + 2 位元組.

  • 數值型別:

    • TINYINT: 1位元組

    • SMALLINT: 2位元組

    • MEDIUMINT: 3位元組

    • INT: 4位元組

    • BIGINT: 8位元組

  • 時間型別

    • DATE: 3位元組

    • TIMESTAMP: 4位元組

    • DATETIME: 8位元組

  • 欄位屬性: NULL 屬性 佔用一個位元組. 如果一個欄位是 NOT NULL 的, 則沒有此屬性.

我們來舉兩個簡單的栗子:

mysql> EXPLAIN SELECT * FROM order_info WHERE user_id < 3 AND product_name = 'p1' AND productor = 'WHH' \G
*************************** 1. row ***************************
           id: 1
  select_type: SIMPLE
        table: order_info
   partitions: NULL
         type: range
possible_keys: user_product_detail_index
          key: user_product_detail_index
      key_len: 9
          ref: NULL
         rows: 5
     filtered: 11.11
        Extra: Using where; Using index
1 row in set, 1 warning (0.00 sec)

上面的例子是從表 order_info 中查詢指定的內容, 而我們從此表的建表語句中可以知道, 表 order_info 有一個聯合索引:

KEY `user_product_detail_index` (`user_id`, `product_name`, `productor`)

不過此查詢語句 WHERE user_id < 3 AND product_name = 'p1' AND productor = 'WHH' 中, 因為先進行 user_id 的範圍查詢, 而根據 最左字首匹配 原則, 當遇到範圍查詢時, 就停止索引的匹配, 因此實際上我們使用到的索引的欄位只有 user_id, 因此在 EXPLAIN 中, 顯示的 key_len 為 9. 因為 user_id 欄位是 BIGINT, 佔用 8 位元組, 而 NULL 屬性佔用一個位元組, 因此總共是 9 個位元組. 若我們將user_id 欄位改為 BIGINT(20) NOT NULL DEFAULT '0', 則 key_length 應該是8.

上面因為 最左字首匹配 原則, 我們的查詢僅僅使用到了聯合索引的 user_id 欄位, 因此效率不算高.

接下來我們來看一下下一個例子:

mysql> EXPLAIN SELECT * FROM order_info WHERE user_id = 1 AND product_name = 'p1' \G;
*************************** 1. row ***************************
           id: 1
  select_type: SIMPLE
        table: order_info
   partitions: NULL
         type: ref
possible_keys: user_product_detail_index
          key: user_product_detail_index
      key_len: 161
          ref: const,const
         rows: 2
     filtered: 100.00
        Extra: Using index
1 row in set, 1 warning (0.00 sec)

這次的查詢中, 我們沒有使用到範圍查詢, key_len 的值為 161. 為什麼呢? 因為我們的查詢條件 WHERE user_id = 1 AND product_name = 'p1' 中, 僅僅使用到了聯合索引中的前兩個欄位, 因此 keyLen(user_id) + keyLen(product_name) = 9 + 50 * 3 + 2 = 161

rows

rows 也是一個重要的欄位. MySQL 查詢優化器根據統計資訊, 估算 SQL 要查詢到結果集需要掃描讀取的資料行數.
這個值非常直觀顯示 SQL 的效率好壞, 原則上 rows 越少越好.

Extra

EXplain 中的很多額外的資訊會在 Extra 欄位顯示, 常見的有以下幾種內容:

  • Using filesort
    當 Extra 中有 Using filesort 時, 表示 MySQL 需額外的排序操作, 不能通過索引順序達到排序效果. 一般有 Using filesort, 都建議優化去掉, 因為這樣的查詢 CPU 資源消耗大.

例如下面的例子:

mysql> EXPLAIN SELECT * FROM order_info ORDER BY product_name \G
*************************** 1. row ***************************
           id: 1
  select_type: SIMPLE
        table: order_info
   partitions: NULL
         type: index
possible_keys: NULL
          key: user_product_detail_index
      key_len: 253
          ref: NULL
         rows: 9
     filtered: 100.00
        Extra: Using index; Using filesort
1 row in set, 1 warning (0.00 sec)

我們的索引是

KEY `user_product_detail_index` (`user_id`, `product_name`, `productor`)

但是上面的查詢中根據 product_name 來排序, 因此不能使用索引進行優化, 進而會產生 Using filesort.
如果我們將排序依據改為 ORDER BY user_id, product_name, 那麼就不會出現 Using filesort 了. 例如:

mysql> EXPLAIN SELECT * FROM order_info ORDER BY user_id, product_name \G
*************************** 1. row ***************************
           id: 1
  select_type: SIMPLE
        table: order_info
   partitions: NULL
         type: index
possible_keys: NULL
          key: user_product_detail_index
      key_len: 253
          ref: NULL
         rows: 9
     filtered: 100.00
        Extra: Using index
1 row in set, 1 warning (0.00 sec)
    • Using index
      "覆蓋索引掃描", 表示查詢在索引樹中就可查詢所需資料, 不用掃描表資料檔案, 往往說明效能不錯

    • Using temporary
      查詢有使用臨時表, 一般出現於排序, 分組和多表 join 的情況, 查詢效率不高, 建議優

      轉載地址:https://segmentfault.com/a/1190000008131735

相關推薦

MySQL 效能優化神器 Explain 使用分析

簡介 MySQL 提供了一個 EXPLAIN 命令, 它可以對 SELECT 語句進行分析, 並輸出 SELECT 執行的詳細資訊, 以供開發人員針對性優化.EXPLAIN 命令用法十分簡單, 在 SELECT 語句前加上 Explain 就可以了, 例如: EXPLAIN SELECT * from use

MySQL 效能優化——「Explain 分析實踐」

DESC、DESCRIBE和EXPLAIN這三個關鍵字都是我們常用的,但是使用場景不同。從MySQL解析器的角度而言,他們的實際用法是一致的。 即實際使用過程中 DESC 等價於 DESCRIBE 等價於 EXPLAIN 。我們常常用於以下兩種場景:

mysql效能優化-慢查詢分析優化索引和配置 (慢查詢日誌,explain,profile)

一、優化概述 二、查詢與索引優化分析 1效能瓶頸定位 Show命令 慢查詢日誌 explain分析查詢 profiling分析查詢 2索引及查詢優化 三、配置優化 1)      max_connections 2)      back_log 3)      interactive_timeout 4)

mysql效能優化-慢查詢分析優化索引和配置

目錄 一、優化概述 二、查詢與索引優化分析 1效能瓶頸定位 Show命令 慢查詢日誌 explain分析查詢 profiling分析查詢 2索引及查詢優化 三、配置優化 1)      max_connections 2)      back_lo

MySQL 性能優化神器 Explain 使用分析

cli .com 不一定 mysql 查 all show sha led 優化 MySQL 性能優化神器 Explain 使用分析 SQL優化案例 mysql 查看優化器重寫後的sql sql優化器會重寫sql,sql在執行時,並不一定就會按照我們寫的順序執行,mysq

MySQL資料庫優化——通過explain查詢分析SQL的執行計劃

使用explain查詢SQL的執行計劃 SQL的執行計劃側面反映出了SQL的執行效率,具體執行方式如下所示: 在執行的SQL前面加上explain關鍵詞即可;   2、每個欄位的說明: 1)、id列數字越大越先執行,如果說數字一樣大,那麼就從上往下依次執行,id列

mysql效能優化------explain詳解

1.explain作用 explain語句提供了MySQL如何執行語句的資訊。解釋選擇、刪除、插入、替換和更新語句如何工作。 2.如何使用 explain your command; se

Mysql 效能優化Explain詳解

explain 功能我們在日常使用中,使用慢查詢找到執行時間比較久的查詢,然後使用SHOW STATUS、SHOW PROFILE、和explain做單條語句的分析。使用explain關鍵字可以模擬優化器執行sql查詢語句,從而知道Mysql是如何處理你的sql語句的。分析你的查詢語句或者表結構的效能瓶頸。

MySQL效能優化MySQL索引優化,order by優化explain優化

前言 今天我們來講講如何優化MySQL的效能,主要從索引方面優化。下期文章講講MySQL慢查詢日誌,我們是依據慢查詢日誌來判斷哪條SQL語句有問題,然後在進行優化,敬請期待MySQL慢查詢日誌篇 建表 // 建表CREATE TABLE IF NOT EXI

MySQL查詢優化explain的深入解析

extra lin sub const query gin alt com nec 本篇文章是對MySQL查詢優化中的explain進行了詳細的分析介紹,需要的朋友參考下 在分析查詢性能時,考慮EXPLAIN關鍵字同樣很管用。EXPLAIN關鍵字一般放在SELECT查

MySQL(三) —— MySQL效能優化之 索引優化

MySQL索引優化 如何選擇合適的列建立索引? 在where從句、group by 從句、order by 從句、on 從句中出現的列 索引欄位越小越好 離散度大的列放在聯合索引的前面 如何判斷列的離散度? 去重查詢看列的唯一值,唯一值越多則離散度越大。 mysql&

MySQL(二) —— MySQL效能優化之 SQL語句優化

          SQL語句優化   MySQL優化的目的   1、避免出現頁面訪問錯誤:或由於資料庫連線超時 timeout 產生頁面5xx錯誤;或由於慢查詢造成頁面無法載入;或由於阻        塞造成資料無法提交;

MySQL (一) —— MySQL效能優化之 慢查詢日誌

                        &nbs

MySQL效能優化(六):分割槽

一: 分割槽簡介 分割槽是根據一定的規則,資料庫把一個表分解成多個更小的、更容易管理的部分。就訪問資料庫應用而言,邏輯上就只有一個表或者一個索引,但實際上這個表可能有N個物理分割槽物件組成,每個分割槽都是一個獨立的物件,可以獨立處理,可以作為表的一部分進行處理。分割槽對應用來說是完全

Mysql效能優化實戰

1、索引設計規範 常見索引列建議: SELECT、UPDATE、DELETE語句的WHERE從句中的列 包含在ORDER BY、GROUP BY、DISTINCT中的欄位,建議聯合索引 多表JOIN的關聯列 索引列的順序: 區分度最高的列放在聯合索引的最左側 儘量把欄位長度

mysql效能優化之建立高效能索引

索引對效能的優化十分重要,是對查詢優化最有效的手段。 一、索引的型別 索引是在儲存引擎層而不是服務層實現的。不同儲存引擎的索引工作方式不一樣。 1、B-Tree索引 它使用的是B-Tree資料結構來儲存資料。b-tree索引能夠加快訪問資料的速度,因為儲存引擎不在需要進行全表掃描

Mysql效能優化之資料型別優化

一、選擇正確的資料型別對於獲得高效能至關重要 1.1更小的通常更好 佔用更少的磁碟、記憶體和CPU快取 1.2儘量避免null 如果查詢中包含可為null的列,對Mysql來說更難優化,因為可為null的列使得索引、索引統計和值都更復雜。會使用更多的儲存空間. 2、整數和實數

從頭開始學MySQL-------效能優化

1.使用LIKE關鍵字可能觸發不了索引         首先執行下面的SQL,準備一些資料。 DROP TABLE IF EXISTS t_student; CREATE TABLE `t_student` ( `id` int(11) NO

資料庫Mysql效能優化

一、影響mysql效能的因素 sql語句查詢速度 伺服器硬體 網絡卡流量 磁碟IO 二、優化mysql的效能方法 優化sql語句,索引 使用快取,把經常使用的資料放到快取中,能節省磁碟IO 優化硬體,使用SSD硬碟 主從

MySQL效能優化總結___本文乃《MySQL效能調優與架構設計》讀書筆記!

一、MySQL的主要適用場景 1、Web網站系統 2、日誌記錄系統 3、資料倉庫系統 4、嵌入式系統 二、MySQL架構圖:   三、MySQL儲存引擎概述 1)MyISAM儲存引擎 MyISAM儲存引擎的表在資料庫中,每一個表