監(jiān)理公司管理系統(tǒng) | 工程企業(yè)管理系統(tǒng) | OA系統(tǒng) | ERP系統(tǒng) | 造價咨詢管理系統(tǒng) | 工程設(shè)計(jì)管理系統(tǒng) | 簽約案例 | 購買價格 | 在線試用 | 手機(jī)APP | 產(chǎn)品資料
X 關(guān)閉

三方法優(yōu)化MySQL數(shù)據(jù)庫查詢

申請免費(fèi)試用、咨詢電話:400-8352-114

文章來源:泛普軟件

在優(yōu)化查詢中,數(shù)據(jù)庫應(yīng)用(如MySQL)即意味著對工具的操作與使用。使用索引、使用EXPLAIN分析查詢以及調(diào)整MySQL的內(nèi)部配置可達(dá)到優(yōu)化查詢的目的。

任何一位數(shù)據(jù)庫程序員都會有這樣的體會:高通信量的數(shù)據(jù)庫驅(qū)動程序中,一條糟糕的SQL查詢語句可對整個應(yīng)用程序的運(yùn)行產(chǎn)生嚴(yán)重的影響,其不僅消耗掉更多的數(shù)據(jù)庫時間,且它將對其他應(yīng)用組件產(chǎn)生影響。

如同其它學(xué)科,優(yōu)化查詢性能很大程度上決定于開發(fā)者的直覺。幸運(yùn)的是,像MySQL這樣的數(shù)據(jù)庫自帶有一些協(xié)助工具。本文簡要討論諸多工具之三種:使用索引,使用EXPLAIN分析查詢以及調(diào)整MySQL的內(nèi)部配置。

#1: 使用索引

MySQL允許對數(shù)據(jù)庫表進(jìn)行索引,以此能迅速查找記錄,而無需一開始就掃描整個表,由此顯著地加快查詢速度。每個表最多可以做到16個索引,此外MySQL還支持多列索引及全文檢索。

給表添加一個索引非常簡單,只需調(diào)用一個CREATE INDEX命令并為索引指定它的域即可。列表A給出了一個例子:

列表 A

mysql> CREATE INDEX idx_username ON users(username);
Query OK, 1 row affected (0.15 sec)
Records: 1  Duplicates: 0  Warnings: 0

這里,對users表的username域做索引,以確保在WHERE或者HAVING子句中引用這一域的SELECT查詢語句運(yùn)行速度比沒有添加索引時要快。通過SHOW INDEX命令可以查看索引已被創(chuàng)建(列表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)

值得注意的是:索引就像一把雙刃劍。對表的每一域做索引通常沒有必要,且很可能導(dǎo)致運(yùn)行速度減慢,因?yàn)橄虮碇胁迦牖蛐薷臄?shù)據(jù)時,MySQL不得不每次都為這些額外的工作重新建立索引。另一方面,避免對表的每一域做索引同樣不是一個非常好的主意,因?yàn)樵谔岣卟迦胗涗浀乃俣葧r,導(dǎo)致查詢操作的速度減慢。這就需要找到一個平衡點(diǎn),比如在設(shè)計(jì)索引系統(tǒng)時,考慮表的主要功能(數(shù)據(jù)修復(fù)及編輯)不失為一種明智的選擇。

#2: 優(yōu)化查詢性能

在分析查詢性能時,考慮EXPLAIN關(guān)鍵字同樣很管用。EXPLAIN關(guān)鍵字一般放在SELECT查詢語句的前面,用于描述MySQL如何執(zhí)行查詢操作、以及MySQL成功返回結(jié)果集需要執(zhí)行的行數(shù)。下面的一個簡單例子可以說明(列表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)這里查詢是基于兩個表連接。EXPLAIN關(guān)鍵字描述了MySQL是如何處理連接這兩個表。必須清楚的是,當(dāng)前設(shè)計(jì)要求MySQL處理的是country表中的一條記錄以及city表中的整個4019條記錄。這就意味著,還可使用其他的優(yōu)化技巧改進(jìn)其查詢方法。例如,給city表添加如下索引(列表D):

列表 D

mysql> CREATE INDEX idx_ccode ON city(countrycode);
Query OK, 4079 rows affected (0.15 sec)
Records: 4079  Duplicates: 0  Warnings: 0

現(xiàn)在,當(dāng)我們重新使用EXPLAIN關(guān)鍵字進(jìn)行查詢時,我們可以看到一個顯著的改進(jìn)(列表E):

列表 E

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    | ref   | idx_ccode     | idx_ccode | 3       | const |  333 | Using where |
+----+-------------+---------+-------+---------------+-----------+---------+-------+------+-------------+
2 rows in set (0.01 sec)

在這個例子中,MySQL現(xiàn)在只需要掃描city表中的333條記錄就可產(chǎn)生一個結(jié)果集,其掃描記錄數(shù)幾乎減少了90%!自然,數(shù)據(jù)庫資源的查詢速度更快,效率更高。(zdnet)

發(fā)布:2007-04-22 09:24    編輯:泛普軟件 · xiaona    [打印此頁]    [關(guān)閉]
相關(guān)文章:
西安OA系統(tǒng)
聯(lián)系方式

成都公司:成都市成華區(qū)建設(shè)南路160號1層9號

重慶公司:重慶市江北區(qū)紅旗河溝華創(chuàng)商務(wù)大廈18樓

咨詢:400-8352-114

加微信,免費(fèi)獲取試用系統(tǒng)

QQ在線咨詢

泛普西安OA快博其他應(yīng)用

西安OA軟件 西安OA新聞動態(tài) 西安OA信息化 西安OA快博 西安OA行業(yè)資訊 西安軟件開發(fā)公司 西安門禁系統(tǒng) 西安物業(yè)管理軟件 西安倉庫管理軟件 西安餐飲管理軟件 西安網(wǎng)站建設(shè)公司