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 | +----+-------------+-----------+------------+--------+---------------+---------+---------+------------------------+------+----------+-------------+