2019/3/28 11:28:24
在優化查詢中,數據庫應用(yòng)(如(rú)MySQL)即意味著(zhe)對工(gōng)具的(de)操作與使用(yòng)。使用(yòng)索引、使用(yòng)EXPLAIN分(fēn)析查詢以及調整MySQL的(de)内部配置可(kě)達到(dào)優化查詢的(de)目的(de)。
#1: 使用(yòng)索引
MySQL允許對數據庫表進行(xíng)索引,以此能(néng)迅速查找記錄,而無需一開(kāi)始就掃描整個(gè)表,由此顯著地(dì)加快查詢速度。每個(gè)表最多可(kě)以做到(dào)16個(gè)索引,此外MySQL還支持多列索引及全文(wén)檢索。
給表添加一個(gè)索引非常簡單,隻需調用(yòng)一個(gè)CREATE INDEX命令并爲索引指定它的(de)域即可(kě)。列表A給出了一個(gè)例子:
列表 A
mysql> CREATE INDEX idx_username ON users(username);
Query OK, 1 row affected (0.15 sec)
Records: 1 Duplicates: 0 Warnings: 0
這裏,對users表的(de)username域做索引,以确保在WHERE或者HAVING子句中引用(yòng)這一域的(de)SELECT查詢語句運行(xíng)速度比沒有(yǒu)添加索引時要快。通過SHOW INDEX命令可(kě)以查看索引已被創建(列表B)。
列表 B
mysql> SHOW INDEX FROM users;
--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+
| Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment |
--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+
| users | 1 | idx_username | 1 | username | A | NULL | NULL | NULL | YES | BTREE | |
--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+
1 row in set (0.00 sec)
值得注意的(de)是:索引就像一把雙刃劍。對表的(de)每一域做索引通常沒有(yǒu)必要,且很可(kě)能(néng)導緻運行(xíng)速度減慢(màn),因爲向表中插入或修改數據時,MySQL不得不每次都(dōu)爲這些額外的(de)工(gōng)作重新建立索引。另一方面,避免對表的(de)每一域做索引同樣不是一個(gè)非常好的(de)主意,因爲在提高(gāo)插入記錄的(de)速度時,導緻查詢操作的(de)速度減慢(màn)。這就需要找到(dào)一個(gè)平衡點,比如(rú)在設計(jì)索引系統時,考慮表的(de)主要功能(néng)(數據修複及編輯)不失爲一種明(míng)智的(de)選擇。
#2: 優化查詢性能(néng)
在分(fēn)析查詢性能(néng)時,考慮EXPLAIN關鍵字同樣很管用(yòng)。EXPLAIN關鍵字一般放(fàng)在SELECT查詢語句的(de)前面,用(yòng)于描述MySQL如(rú)何執行(xíng)查詢操作、以及MySQL成功返回結果集需要執行(xíng)的(de)行(xíng)數。下面的(de)一個(gè)簡單例子可(kě)以說明(míng)(列表C)這一過程:
列表 C
mysql> EXPLAIN SELECT city.name, city.district FROM city, country WHERE city.countrycode = country.code AND country.code = 'IND';
+----+-------------+---------+-------+---------------+---------+---------+-------+------+-------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+---------+-------+---------------+---------+---------+-------+------+-------------+
| 1 | SIMPLE | country | const | PRIMARY | PRIMARY | 3 | const | 1 | Using index |
| 1 | SIMPLE | city | ALL | NULL | NULL | NULL | NULL | 4079 | Using where |
+----+-------------+---------+-------+---------------+---------+---------+-------+------+-------------+
2 rows in set (0.00 sec)這裏查詢是基于兩個(gè)表連接。EXPLAIN關鍵字描述了MySQL是如(rú)何處理(lǐ)連接這兩個(gè)表。必須清楚的(de)是,當前設計(jì)要求MySQL處理(lǐ)的(de)是country表中的(de)一條記錄以及city表中的(de)整個(gè)4019條記錄。這就意味著(zhe),還可(kě)使用(yòng)其他(tā)的(de)優化技巧改進其查詢方法。例如(rú),給city表添加如(rú)下索引(列表D):
列表 D
mysql> CREATE INDEX idx_ccode ON city(countrycode);
Query OK, 4079 rows affected (0.15 sec)
Re
深圳市南山區南山街(jiē)道南海(hǎi)大(dà)道西(xī)桂廟路(lù)北陽光(guāng)華藝大(dà)廈1棟4F、4G-04
咨詢電話(huà):136 8237 6272
大(dà)客戶咨詢:139 0290 5075
業(yè)務QQ:195006118
技術(shù)QQ:179981967