亚洲韩日午夜视频,欧美日韩在线精品一区二区三区,韩国超清无码一区二区三区,亚洲国产成人影院播放,久草新在线,在线看片AV色

您好,歡迎來到思海網(wǎng)絡(luò),我們將竭誠為您提供優(yōu)質(zhì)的服務(wù)! 誠征網(wǎng)絡(luò)推廣 | 網(wǎng)站備案 | 幫助中心 | 軟件下載 | 購買流程 | 付款方式 | 聯(lián)系我們 [ 會員登錄/注冊 ]
促銷推廣
客服中心
業(yè)務(wù)咨詢
有事點擊這里…  531199185
有事點擊這里…  61352289
點擊這里給我發(fā)消息  81721488
有事點擊這里…  376585780
有事點擊這里…  872642803
有事點擊這里…  459248018
有事點擊這里…  61352288
有事點擊這里…  380791050
技術(shù)支持
有事點擊這里…  714236853
有事點擊這里…  719304487
有事點擊這里…  1208894568
有事點擊這里…  61352289
在線客服
有事點擊這里…  531199185
有事點擊這里…  61352288
有事點擊這里…  983054746
有事點擊這里…  893984210
當前位置:首頁 >> 技術(shù)文章 >> 文章瀏覽
技術(shù)文章

MySQL十大優(yōu)化技巧

添加時間:2011-2-3  添加: admin 

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

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

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

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

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正在進行什么樣的查詢操作,這可以幫助你發(fā)現(xiàn)瓶頸的所在,并顯示出查詢或表結(jié)構(gòu)在哪里出了問題。

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

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

 

添加索引到group_id field后

 

3. 利用LIMIT 1取得唯一行

有時,當你要查詢一張表是,你知道自己只需要看一行。你可能會去的一條十分獨特的記錄,或者只是剛好檢查了任何存在的記錄數(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. 索引中的檢索字段

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

 

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

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

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

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 table scans

6. 不要使用BY RAND()命令

這是一個令很多新手程序員會掉進去的陷阱。你可能不知不覺中制造了一個可怕的平靜。這個陷阱在你是用BY RAND()命令時就開始創(chuàng)建了。

如果您真的需要隨機顯示你的結(jié)果,有很多更好的途徑去實現(xiàn)。誠然這需要寫更多的代碼,但是能避免性能瓶頸的出現(xiàn)。問題在于,MySQL可能會為表中每一個獨立的行執(zhí)行BY RAND()命令(這會消耗處理器的處理能力),然后給你僅僅返回一行。

1. // what NOT to do:  

2. $r = mysql_query("SELECT username FROM user ORDER BY RAND() LIMIT 1");  

3. // much better:  

4. $r = mysql_query("SELECT count(*) FROM user");  

5. $d = mysql_fetch_row($r);  

6. $rand = mt_rand(0,$d[0] - 1);  

7.  

8. $r = mysql_query("SELECT username FROM user LIMIT $rand, 1");

7. 盡量避免SELECT *命令

從表中讀取越多的數(shù)據(jù),查詢會變得更慢。他增加了磁盤需要操作的時間,還是在數(shù)據(jù)庫服務(wù)器與WEB服務(wù)器是獨立分開的情況下。你將會經(jīng)歷非常漫長的網(wǎng)絡(luò)延遲,僅僅是因為數(shù)據(jù)不必要的在服務(wù)器之間傳輸。

始終指定你需要的列,這是一個非常良好的習慣。

1. // not preferred  

2. $r = mysql_query("SELECT * FROM user WHERE user_id = 1");  

3. $d = mysql_fetch_assoc($r);  

4. echo "Welcome {$d['username']}";  

5. // better:  

6. $r = mysql_query("SELECT username FROM user WHERE user_id = 1");  

7. $d = mysql_fetch_assoc($r);  

8. echo "Welcome {$d['username']}";   

9. // the differences are more significant with bigger result sets

8. 從PROCEDURE ANALYSE()中獲得建議

PROCEDURE ANALYSE()可讓MySQL的柱結(jié)構(gòu)分析和表中的實際數(shù)據(jù)來給你一些建議。如果你的表中已經(jīng)存在實際數(shù)據(jù)了,能為你的重大決策服務(wù)。

 

9. 準備好的語句

準備好的語句,可以從性能優(yōu)化和安全兩方面對大家有所幫助。

準備好的語句在過濾已經(jīng)綁定的變量默認情況下,能給應用程序以有效的保護,防止SQL注入攻擊。當然你也可以手動過濾,不過由于大多數(shù)程序員健忘的性格,很難達到效果。

1. // create a prepared statement  

2. if ($stmt = $mysqli->prepare("SELECT username FROM user WHERE state=?")) {   

3.     // bind parameters  

4.     $stmt->bind_param("s", $state);   

5.     // execute  

6.     $stmt->execute();   

7.     // bind result variables  

8.     $stmt->bind_result($username);    

9.     // fetch value  

10.     $stmt->fetch();   

11.     printf("%s is from %s\n", $username, $state);    

12.     $stmt->close();  

13. }

10. 將IP地址存儲為無符號整型

許多程序員在創(chuàng)建一個VARCHAR(15)時并沒有意識到他們可以將IP地址以整數(shù)形式來存儲。當你有一個INT類型時,你只占用4個字節(jié)的空間,這是一個固定大小的領(lǐng)域。

你必須確定你所操作的列是一個UNSIGNED INT類型的,因為IP地址將使用32位unsigned integer。

1. $r = "UPDATE users SET ip = INET_ATON('{$_SERVER['REMOTE_ADDR']}') WHERE user_id = $user_id";

十大MySQL優(yōu)化技巧就介紹到這里。

關(guān)健詞:MySQL,十大優(yōu)化

分享到:

頂部 】 【 關(guān)閉
版權(quán)所有:佛山思海電腦網(wǎng)絡(luò)有限公司 ©1998-2024 All Rights Reserved.
聯(lián)系電話:(0757)22630313、22633833
中華人民共和國增值電信業(yè)務(wù)經(jīng)營許可證: 粵B1.B2-20030321 備案號:粵B2-20030321-1
網(wǎng)站公安備案編號:44060602000007 交互式欄目專項備案編號:200303DD003  
察察 工商 網(wǎng)安 舉報有獎  警警  手機打開網(wǎng)站