MySQL系列:效能優化

libingql發表於2018-03-29

1. 優化簡介

  MySQL效能優化包括:查詢優化、資料庫結構優化、MySQL伺服器優化等。

2. 查詢優化

2.1 分析查詢語句

  MySQL提供EXPLAIN和DESCRIBE,用來分析查詢語句。

  EXPLAIN語句的基本語法:

EXPLAIN [EXTENDED] SELECT select_options

  其中,EXTENDED用於EXPLAIN產生附加資訊,select_options是SELECT語句的查詢選項,包括FROM WHERE子句等。

mysql> EXPLAIN SELECT * FROM product;
+----+-------------+---------+------------+------+---------------+------+---------+------+------+----------+-------+
| id | select_type | table   | partitions | type | possible_keys | key  | key_len | ref  | rows | filtered | Extra |
+----+-------------+---------+------------+------+---------------+------+---------+------+------+----------+-------+
|  1 | SIMPLE      | product | NULL       | ALL  | NULL          | NULL | NULL    | NULL |    1 |   100.00 | NULL  |
+----+-------------+---------+------------+------+---------------+------+---------+------+------+----------+-------+

  其中,

    id:SELECT識別符,SELECT的查詢序列號。

    select_type:SELECT語句的型別。

      取值包括:

      (1)SIMPLE:簡單查詢,不包括連線查詢和子查詢

      (2)PRIMARY:主查詢,或最外層的查詢語句

      (3)UNION:連線查詢的第2個或後面的查詢語句

      (4)DEPENDENT UNION:連線查詢中的第2個或後面的SELECT語句,取決於外面的查詢

      (5)UNION RESULT:連線查詢的結果

      (6)SUBQUERY:子查詢中的第1個SELECT語句

      (7)DEPENDENT SUBQUERY:子查詢中的第1個SELECT,取決於外面的查詢

      (8)DERIVED:匯出表的SELECT(FROM子句的子查詢)

    table:查詢的表

    type:表的連線型別

      表的連線型別從最佳到最差順序:

      (1)system:該表是僅有一行的系統表,是const連線型別的一個特例。

      (2)const:資料表最多隻有一個匹配行,const表查詢速度很快,因為只讀取一次。

            const用於使用常量值比較PRIMARY KEY或UNIQUE索引場合。

mysql> EXPLAIN SELECT * FROM product WHERE id = 1;
+----+-------------+---------+------------+-------+---------------+---------+---------+-------+------+----------+-------+
| id | select_type | table   | partitions | type  | possible_keys | key     | key_len | ref   | rows | filtered | Extra |
+----+-------------+---------+------------+-------+---------------+---------+---------+-------+------+----------+-------+
|  1 | SIMPLE      | product | NULL       | const | PRIMARY       | PRIMARY | 4       | const |    1 |      100 | NULL  |
+----+-------------+---------+------------+-------+---------------+---------+---------+-------+------+----------+-------+

      (3)eq_ref:用在一個索引的所有部分被連線使用並且索引是UNIQUE或PRIMARY KEY。

            eq_ref可以用於使用"="操作符比較帶索引的列。比較值為常量或一個在該表前面所讀取的列的表示式。

mysql> EXPLAIN SELECT
    -> product.*
    -> FROM
    -> product
    -> INNER JOIN category ON product.category_id = category.id;
+----+-------------+-----------+------------+--------+---------------+---------+---------+------------------------+------+----------+-------------+
| id | select_type | table     | partitions | type   | possible_keys | key     | key_len | ref                    | rows | filtered | Extra       |
+----+-------------+-----------+------------+--------+---------------+---------+---------+------------------------+------+----------+-------------+
|  1 | SIMPLE      | product   | NULL       | ALL    | NULL          | NULL    | NULL    | NULL                   |  118 |      100 | Using where |
|  1 | SIMPLE      | category  | NULL       | eq_ref | PRIMARY       | PRIMARY | 4       | db.product.category_id |    1 |      100 | Using index |
+----+-------------+-----------+------------+--------+---------------+---------+---------+------------------------+------+----------+-------------+

 

相關文章