掃描二維碼關注

首頁 APP開(kāi)發小(xiǎo)程序開(kāi)發 微信公衆号 網站建設 營銷推廣 經典案列 産品服務 關于我們

“學習(xí)不僅是掌握知識”

向書(shū)本學習(xí),還要向實踐學習(xí)、向生活學習(xí)。消化已有(yǒu)知識,
而且要力求有(yǒu)所發現、有(yǒu)所發明(míng)、有(yǒu)所創造

MySQL數據庫查詢優化淺析

2019/3/28 11:28:24

MySQL數據庫查詢優化淺析

在優化查詢中,數據庫應用(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

更多可(kě)以了解的(de)信息

客戶案列
新聞資訊
資質榮譽
團隊風采
項目進度查詢

售前QQ咨詢
QQ溝通 項目QQ溝通

精銳軟件(jiàn)

Copyright© 2018-2023 深圳市無窮大軟件技術有限公司 All Rights Reserved. 京ICP證000000号 公安備案号:粵公網安備44030502009460号