時間: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í)際上是可以阻止查詢緩存工作的。
- //?query?cache?does?NOT?work??? ?
- $r?=?mysql_query("SELECT?username?FROM?user?WHERE?signup_date?>=?CURDATE()");??? ?
- ?? ?
- //?query?cache?works!??? ?
- $today?=?date("Y-m-d");??? ?
- $r?=?mysql_query("SELECT?username?FROM?user?WHERE?signup_date?>=?'$today'");?? ?
- ?
- //?query?cache?does?NOT?work?
- $r?=?mysql_query("SELECT?username?FROM?user?WHERE?signup_date?>=?CURDATE()"); ?
- ?
- //?query?cache?works! ?
- $today?=?date("Y-m-d"); ?
- $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后將停止掃描,而不是去掃描整個表或索引。、
- //?do?I?have?any?users?from?Alabama???? ?
- //?what?NOT?to?do:??? ?
- $r?=?mysql_query("SELECT?*?FROM?user?WHERE?state?=?'Alabama'");??? ?
- if?(mysql_num_rows($r)?>?0)?{??? ?
- ????//?...??? ?
- }????? ?
- //?much?better:??? ?
- $r?=?mysql_query("SELECT?1?FROM?user?WHERE?state?=?'Alabama'?LIMIT?1");??? ?
- if?(mysql_num_rows($r)?>?0)?{??? ?
- ????//?...??? ?
- }???
4. 索引中的檢索字段
索引不僅是主鍵或唯一鍵。如果你想搜索表中的任何列,你應(yīng)該一直指向索引。
?
5.保證連接的索引是相同的類型
如果應(yīng)用程序中包含多個連接查詢,你需要確保你鏈接的列在兩邊的表上都被索引。這會影響MySQL如何優(yōu)化內(nèi)部聯(lián)接操作。
此外,加入的列,必須是同一類型。例如,你加入一個DECIMAL列,而同時加入另一個表中的int列,MySQL將無法使用其中至少一個指標(biāo)。即使字符編碼必須同為字符串類型。
- //?looking?for?companies?in?my?state??? ?
- $r?=?mysql_query("SELECT?company_name?FROM?users?? ?
- ????LEFT?JOIN?companies?ON?(users.state?=?companies.state)?? ?
- ????WHERE?users.id?=?$user_id");??? ?
- ?? ?
- //?both?state?columns?should?be?indexed??? ?
- //?and?they?both?should?be?the?same?type?and?character?encoding??? ?
- //?or?MySQL?might?do?full關(guān)鍵詞標(biāo)簽:MySQL優(yōu)化
相關(guān)閱讀
熱門文章 Xbox Game Pass 10款MySQL數(shù)據(jù)庫客戶端圖形界面管理工具推薦 MySQL常用維護(hù)管理工具 MySQL數(shù)據(jù)庫啟動失敗1067進(jìn)程意外終止的解決辦法總結(jié)
人氣排行 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建表語句