優化mysql數據庫_MySQL數據庫十大優化技巧

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

1. 優化你的MySQL查詢緩存

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

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

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關鍵字是另一個MySQL優化技巧,可以讓你了解MySQL正在進行什么樣的查詢操作,這可以幫助你發現瓶頸的所在,并顯示出查詢或表結構在哪里出了問題。

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

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

6560a26cb29baebd68c4828e6de54b52.png

添加索引到group_id field后

db5a33b147b8f54fe8fc0ccc68f486fd.png

3. 利用LIMIT 1取得唯一行

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

在這種情況下,增加一個LIMIT 1會令你的查詢更加有效。這樣數據庫引擎發現只有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. 索引中的檢索字段

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

11c6b5409dcff3c65a3aa391b1f2165c.png

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

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

此外,加入的列,必須是同一類型。例如,你加入一個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()命令時就開始創建了。

如果您真的需要隨機顯示你的結果,有很多更好的途徑去實現。誠然這需要寫更多的代碼,但是能避免性能瓶頸的出現。問題在于,MySQL可能會為表中每一個獨立的行執行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 *命令

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

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

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的柱結構分析和表中的實際數據來給你一些建議。如果你的表中已經存在實際數據了,能為你的重大決策服務。

1d1b8c18ab5525ef21d897e5be1c39b1.png

9. 準備好的語句

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

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

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地址存儲為無符號整型

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

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

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

十大MySQL優化技巧就介紹到這里。

授權:免費軟件 大小:44M 語言:

下載地址

本周共下載 3 次

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/538025.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/538025.shtml
英文地址,請注明出處:http://en.pswp.cn/news/538025.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

跋山涉水——深入 Redis 字典遍歷

Redis 字典的遍歷過程邏輯比較復雜,互聯網上對這一塊的分析講解非常少。我也花了不少時間對源碼的細節進行了整理,將我個人對字典遍歷邏輯的理解呈現給各位讀者。也許讀者們對字典的遍歷過程有比我更好的理解,還請不吝指教。一邊遍歷一邊修改…

linux下VI模式中上下左右鍵和回退鍵出現字母

原文地址:http://blog.csdn.net/u012860950/article/details/50127779 ---------------------------------------------------------------- 1.編輯/etc/vim/vimrc.tiny 由于/etc/vim/vimrc.tiny的擁有者是root用戶,所以要在root的權限下對這個文件進行修…

mysql數據庫查詢優化建議_mysql數據庫查詢優化的24條建議

MySQL是一個強大的開源數據庫。隨著MySQL上的應用越來越多,MySQL逐漸遇到了瓶頸。這里提供一些關于Mysql 數據庫查詢優化的24條優化建議,僅供參考。Mysql 查詢優化1、使用慢查詢日志,找出執行慢的查詢。2、使用 EXPLAIN 來決定查詢功能是否合…

常規sql讀取CLOB

plsql下,普通sqlsql-cmd下總結: 常規的sql,查詢clob字段,只能顯示部分內容。 查clob內容select dbms_lob.substr(c_content) from table_content t dbms_lob.substr將大文本轉換字符類型讀出來.dbms_lob.substr的轉換對字段conten…

精解 ES6箭頭函數

🐱 個人主頁:SHOW科技,公眾號:SHOW科技 🙋?♂? 作者簡介:2020參加工作,專注于前端各領域技術,共同學習共同進步,一起加油呀! 💫優質專欄&#x…

硬盤主引導記錄詳解

說明:硬盤主引導記錄獨立于操作系統,但又和操作系統息息相關——很多時候它又是由; 操作系統所提供的工具所生成(例外的情況是您使用了其他的分區工具,不過它又運行在; 什么操作系統中呢?;()。;; 如果您安裝…

Oracle char varchar varchar2 nvarchar2 的區別

上面字符類型能保存多少個字符與oracle當前的字符集有關系。 select userenv(language) from dual; 假設長度2000字節, 如果字符集是16位編碼的,ZHS16GBK,那么每個字符16位,2字節,所以可以容納1000字符。 如果是32位編…

樹莓派lnmp安裝mysql_在樹莓派上安裝 LNMP

樹莓派支持安裝非常多的操作系統,如官方所展示:這里我選擇了推薦的 Raspbian 系統,它基于 Debian,這就意味著我可以按照 Debian 的方式來安裝軟件。一、安裝 Nginx0、先將系統更新到最新狀態$ sudo apt-get update && sud…

openlayers5之熱力圖heatmap

版權聲明:本文為博主原創文章,未經博主允許不得轉載。 https://blog.csdn.net/gisdoer/article/details/81745645 openlayers5之熱力圖 點擊查看文章

maven項目在打war包時出現非法字符: '\ufeff' 解決方案

http://blog.csdn.net/qi_fei/article/details/61416319 --------------------------------------------問題描述: 開發工具MyEclipse 的總體開發環境,編碼格式總體設置為UTF-8,在將web項目打包的時候出現:非法字符:\u…

0027-生成圓

題目 生成圓難度級別:A; 運行時間限制:1000ms; 運行空間限制:51200KB; 代碼長度限制:2000000B 試題描述給你一些特殊的圓,每個這樣的圓每秒可以產生一個普通的圓,如果給你…

mysql啟多_MySQL啟多個實例

很多朋友都想在一臺服務器上運行多個MySQL Instance,究竟怎么做呢?首先要明晰幾個原理, 簡稱為mysqld讀取my.cnf的順序:第一搜,首先讀取/etc/my.cnf,多實例這個配置文件不會存在。:-(第二搜&…

數據連接池druid 和 大數據框架druid

叫druid的有兩個開源項目。 一個是:Druid是一個JDBC組件,它包括三部分: DruidDriver 代理Driver,能夠提供基于Filter-Chain模式的插件體系。 DruidDataSource 高效可管理的數據庫連接池。 SQLParser 另一個是&#xff…

零基礎入門深度學習(5) - 循環神經網絡

往期回顧 在前面的文章系列文章中,我們介紹了全連接神經網絡和卷積神經網絡,以及它們的訓練和使用。他們都只能單獨的取處理一個個的輸入,前一個輸入和后一個輸入是完全沒有關系的。但是,某些任務需要能夠更好的處理序列的信息&am…

sql排名名次分頁mysql_mysql 實現排名及中文排序實例[分頁累加行號]

/*排名相同情況下,優先按姓名排序*/SELECT t.name, t.company_name, rownum:rownum1 as rankNum, t.ss from (SELECT u.name, sci.company_name, rownum:0,(u.check_numu.online_hours) as ss FROM v_user uLEFT JOIN sys_company_info sci ON u.companyId sci.com…

世上最簡單的mysql_史上最簡單安裝MySQL教程

1.安裝MySQL很多都推薦在MySQL官網進行安裝,我剛開始試的時候官網下載zip文件,打開完全找不到,踩坑了后面我發現了Windows簡易安裝,俗稱傻子都會安裝安裝好了就會看到一個這個文件安裝之前首先你的有沒有這個你就無法安裝,這個可以去這里進行下載安裝好了就可以安裝MySQL了因為…

linux下ftp配置文件詳解

# 匿名用戶配置 anonymous_enableYES # 是否允許匿名ftp,如否則選擇NO anon_upload_enableYES # 匿名用戶是否能上傳 anon_mkdir_write_enableYES # 匿名用戶是否能創建目錄 anon_other_write_enableYES # 修改文件名和刪除文件 # 本地用戶配置 …

Eclipse Maven 編譯錯誤 Dynamic Web Module 3.0 requires Java 1.6 or newer 解決方法

eclipse maven 項目報 Description Resource Path Location TypeDynamic Web Module 3.0 requires Java 1.6 or newer. bdp line 1 Maven Java EE Configuration ProblemDescription Resource Path Location Type One or more constraints have not been satisfied. bdp line 1…

帆軟按鈕控件變查詢_帆軟報表(多sheet)自定義分頁查詢

三、添加自定義按鈕以及JS事件1、打開‘模板Web屬性’2、選中‘填報頁面設置’,修改2)為‘為模板單獨設置‘,3)中是前面七個是添加的自定義按鈕;通過4)按鈕進行設置;5)操作是添加‘加載結束’事件;接下來詳細講述每個步…

使用Python-Flask框架開發Web網站系列課程(一)構建項目

版權聲明:如需轉載,請注明轉載地址。 https://blog.csdn.net/oJohnny123/article/details/81907475 前言 使用IDE:PyCharm 操作系統: Mac Python版本:3.6 我的郵箱:51263921qq.com 交流群: 372430835 請注意,既然要學習…