IT貓撲網(wǎng):您身邊最放心的安全下載站! 最新更新|軟件分類|軟件專題|手機(jī)版|論壇轉(zhuǎn)貼|軟件發(fā)布

您當(dāng)前所在位置: 首頁數(shù)據(jù)庫MYSQL → WEB程序員需要掌握的十大MySQL優(yōu)化技巧

WEB程序員需要掌握的十大MySQL優(yōu)化技巧

時間:2015-06-28 00:00:00 來源:IT貓撲網(wǎng) 作者:網(wǎng)管聯(lián)盟 我要評論(0)

WEB開發(fā)者不光要解決程序的效率問題,對數(shù)據(jù)庫的快速訪問和相應(yīng)也是一個大問題。希望本文能對大家掌握MySQL優(yōu)化技巧有所幫助。

1.優(yōu)化你的MySQL查詢緩存

在MySQL服務(wù)器上進(jìn)行查詢,可以啟用高速查詢緩存。讓數(shù)據(jù)庫引擎在后臺悄悄的處理是提高性能的最有效方法之一。當(dāng)同一個查詢被執(zhí)行多次時,如果結(jié)果是從緩存中提取,那是相當(dāng)快的。

但主要的問題是,它是那么容易被隱藏起來以至于我們大多數(shù)程序員會忽略它。在有些處理任務(wù)中,我們實(shí)際上是可以阻止查詢緩存工作的。

  1. //?query?cache?does?NOT?work??? ?
  2. $r?=?mysql_query("SELECT?username?FROM?user?WHERE?signup_date?>=?CURDATE()");??? ?
  3. ?? ?
  4. //?query?cache?works!??? ?
  5. $today?=?date("Y-m-d");??? ?
  6. $r?=?mysql_query("SELECT?username?FROM?user?WHERE?signup_date?>=?'$today'");?? ?
  7. ?
  8. //?query?cache?does?NOT?work?
  9. $r?=?mysql_query("SELECT?username?FROM?user?WHERE?signup_date?>=?CURDATE()"); ?
  10. ?
  11. //?query?cache?works! ?
  12. $today?=?date("Y-m-d"); ?
  13. $r?=?mysql_query("SELECT?username?FROM?user?WHERE?signup_date?>=?'$today'");?

2.用EXPLAIN使你的SELECT查詢更加清晰

使用EXPLAIN關(guān)鍵字是另一個MySQL優(yōu)化技巧,可以讓你了解MySQL正在進(jìn)行什么樣的查詢操作,這可以幫助你發(fā)現(xiàn)瓶頸的所在,并顯示出查詢或表結(jié)構(gòu)在哪里出了問題。

EXPLAIN查詢的結(jié)果,可以告訴你那些索引正在被引用,表是如何被掃描和排序的等等。

實(shí)現(xiàn)一個SELECT查詢(最好是比較復(fù)雜的一個,帶joins方式的),在里面添加上你的關(guān)鍵詞解釋,在這里我們可以使用phpMyAdmin,他會告訴你表中的結(jié)果。舉例來說,假如當(dāng)我在執(zhí)行joins時,正忘記往一個索引中添加列,EXPLAIN能幫助我找到問題的所在。

添加之前

添加索引到group_id field后

添加之后

3.利用LIMIT 1取得唯一行

有時,當(dāng)你要查詢一張表是,你知道自己只需要看一行。你可能會去的一條十分獨(dú)特的記錄,或者只是剛好檢查了任何存在的記錄數(shù),他們都滿足了你的WHERE子句。

在這種情況下,增加一個LIMIT 1會令你的查詢更加有效。這樣數(shù)據(jù)庫引擎發(fā)現(xiàn)只有1后將停止掃描,而不是去掃描整個表或索引。、

  1. //?do?I?have?any?users?from?Alabama???? ?
  2. //?what?NOT?to?do:??? ?
  3. $r?=?mysql_query("SELECT?*?FROM?user?WHERE?state?=?'Alabama'");??? ?
  4. if?(mysql_num_rows($r)?>?0)?{??? ?
  5. ????//?...??? ?
  6. }????? ?
  7. //?much?better:??? ?
  8. $r?=?mysql_query("SELECT?1?FROM?user?WHERE?state?=?'Alabama'?LIMIT?1");??? ?
  9. if?(mysql_num_rows($r)?>?0)?{??? ?
  10. ????//?...??? ?
  11. }???

4. 索引中的檢索字段

索引不僅是主鍵或唯一鍵。如果你想搜索表中的任何列,你應(yīng)該一直指向索引。

索引中的檢索字段?

5.保證連接的索引是相同的類型

如果應(yīng)用程序中包含多個連接查詢,你需要確保你鏈接的列在兩邊的表上都被索引。這會影響MySQL如何優(yōu)化內(nèi)部聯(lián)接操作。

此外,加入的列,必須是同一類型。例如,你加入一個DECIMAL列,而同時加入另一個表中的int列,MySQL將無法使用其中至少一個指標(biāo)。即使字符編碼必須同為字符串類型。

  1. //?looking?for?companies?in?my?state??? ?
  2. $r?=?mysql_query("SELECT?company_name?FROM?users?? ?
  3. ????LEFT?JOIN?companies?ON?(users.state?=?companies.state)?? ?
  4. ????WHERE?users.id?=?$user_id");??? ?
  5. ?? ?
  6. //?both?state?columns?should?be?indexed??? ?
  7. //?and?they?both?should?be?the?same?type?and?character?encoding??? ?
  8. //?or?MySQL?might?do?full關(guān)鍵詞標(biāo)簽:MySQL優(yōu)化

相關(guān)閱讀

文章評論
發(fā)表評論

熱門文章 Xbox Game Pass Xbox Game Pass 10款MySQL數(shù)據(jù)庫客戶端圖形界面管理工具推薦 10款MySQL數(shù)據(jù)庫客戶端圖形界面管理工具推薦 MySQL常用維護(hù)管理工具 MySQL常用維護(hù)管理工具 MySQL數(shù)據(jù)庫啟動失敗1067進(jìn)程意外終止的解決辦法總結(jié) MySQL數(shù)據(jù)庫啟動失敗1067進(jìn)程意外終止的解決辦法總結(jié)

相關(guān)下載

人氣排行 10款MySQL數(shù)據(jù)庫客戶端圖形界面管理工具推薦 MySQL數(shù)據(jù)庫啟動失敗1067進(jìn)程意外終止的解決辦法總結(jié) Mysql 1045錯誤解決辦法 MySQL服務(wù)器進(jìn)程CPU占用100%解決辦法 MySQL導(dǎo)出導(dǎo)入命令的用例 MySQL連接字符串的實(shí)際操作步驟匯總 MySQL無法啟動、無法停止各種解決方法總結(jié) 三種常用的MySQL建表語句