MySql資料庫優化

来源:http://www.cnblogs.com/fields/archive/2016/04/29/5445042.html
-Advertisement-
Play Games

今天瀏覽百度,看到一篇關於MySql資料庫優化的經驗,看了大概懂,就成自己的了 優化你的MySQL查詢緩存 在MySQL伺服器上進行查詢,可以啟用高速查詢緩存。讓資料庫引擎在後臺悄悄的處理是提高性能的最有效方法之一。當同一個查詢被執行多次時,如果結果是從緩存中提取,那是相當快的。 但主要的問題是,它 ...


  今天瀏覽百度,看到一篇關於MySql資料庫優化的經驗,看了大概懂,就成自己的了

  • 優化你的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'");
  • 用EXPLAIN使你的SELECT查詢更加清晰 使用EXPLAIN關鍵字是另一個MySQL優化技巧,可以讓你瞭解MySQL正在進行什麼樣的查詢操作,這可以幫助你發現瓶頸的所在,並顯示出查詢或表結構在哪裡出了問題。 EXPLAIN查詢的結果,可以告訴你那些索引正在被引用,表是如何被掃描和排序的等等。 實現一個SELECT查詢(最好是比較複雜的一個,帶joins方式的),在裡面添加上你的關鍵詞解釋,在這裡我們可以使用phpMyAdmin,他會告訴你表中的結果。舉例來說,假如當我在執行joins時,正忘記往一個索引中添加列,EXPLAIN能幫助我找到問題的所在。 添加索引到group_id field後 MySQL資料庫十大優化技巧 MySQL資料庫十大優化技巧
  • 利用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. }
  • 索引中的檢索欄位 索引不僅是主鍵或唯一鍵。如果你想搜索表中的任何列,你應該一直指向索引。 MySQL資料庫十大優化技巧
  • 保證連接的索引是相同的類型 如果應用程式中包含多個連接查詢,你需要確保你鏈接的列在兩邊的表上都被索引。這會影響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
  • 不要使用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");
  • 儘量避免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
  • 從PROCEDURE ANALYSE()中獲得建議 PROCEDURE ANALYSE()可讓MySQL的柱結構分析和表中的實際數據來給你一些建議。如果你的表中已經存在實際數據了,能為你的重大決策服務。 MySQL資料庫十大優化技巧
  • 準備好的語句 準備好的語句,可以從性能優化和安全兩方面對大家有所幫助。 準備好的語句在過濾已經綁定的變數預設情況下,能給應用程式以有效的保護,防止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. }
  • 將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優化技巧就介紹到這裡。以上內容部分轉自百度經驗
您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 我是oracle 界的小白,由於公司領導要求,不得不硬著頭皮在網上找rman備份還原的方法,廢話不多說,具體看例子(window) 運行CMD; rman target 管理員賬號/密碼@orcl 備份run{allocate channel d1 device type disk format ' ...
  • 在mysql中,有時我們在做資料庫查詢時,需要得到某欄位中包含某個值的記錄,但是它也不是用like能解決的,使用like可能查到我們不想要的記錄,它比like更精準,這時候mysql的FIND_IN_SET函數就派上用場了,下麵來具體瞭解一下。 FIND_IN_SET(str,strlist)函數 ...
  • 一、開篇 在進行配置只讀路由的時候,需要進行配置可用性組中的可用性副本,如下如所示: 每一項都是啥意思可以看看這個鏈接 https://msdn.microsoft.com/zh-cn/library/hh213002(v=sql.120).aspx 在“可用性副本屬性”對話框中,可以更改主角色和輔 ...
  • MySQL包含對觸發器的支持。觸發器是一種與表操作有關的資料庫對象,當觸發器所在表上出現指定事件時,將調用該對象,即表的操作事件觸發表上的觸發器的執行。 創建觸發器在MySQL中,創建觸發器語法如下: 代碼如下: CREATE TRIGGER trigger_nametrigger_timetrig ...
  • 1.安裝mysql-5.5的yum源 2.修改安裝好的yum源 編輯 /etc/yum.repos.d/mysql-community.repo文件,將5.5的enabled改為1,5.6的enabled改為0 3.安裝mysql-5.5 4.調整配置 編輯 /etc/my.cnf 文件 ...
  • 在Microsoft SQL Server 2008中,你可以實現把表格變數傳遞到存儲過程中,如果變數可以被聲明,那麼它就可以被傳遞。下麵我們來具體介紹如何把表格變數(包括內含的數據)傳遞到存儲過程和功能中去。 傳遞表值參數 用戶經常會碰到許多需要把數值容器而非單個數值放到存儲過程里的情況。對於大部 ...
  • 設計索引的原則1. 搜索的索引列,不一定是所要選擇的列。換句話說,最適合索引的列是出現在WHERE子句中的列,或連接子句中指定的列,而不是出現在SELECT 關鍵字後的選擇列表中的列。 2. 使用惟一索引。考慮某列中值的分佈。對於惟一值的列,索引的效果最好,而具有多個重覆值的列,其索引效果最差。例如 ...
  • 1. 關於Cluster cluster_known_nodes:4 cluster_size:3 說明集群中總共有4個節點;集群的size是3,相當於3個主節點參與了槽位分配 ...
一周排行
    -Advertisement-
    Play Games
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...