MySql的優化步驟

来源:http://www.cnblogs.com/androidshouce/archive/2016/06/22/5605779.html
-Advertisement-
Play Games

MySql優化的一般步驟: 1.通過show status 命令瞭解各種sql的執行效率 SHOW STATUS提供msyql伺服器的狀態信息 一般情況下,我們只需要瞭解以”Com”開頭的指令 show session status like ‘Com%’:顯示當前的連接的統計結果 show glo ...


MySql優化的一般步驟:

1.通過show status 命令瞭解各種sql的執行效率

  SHOW STATUS提供msyql伺服器的狀態信息

  一般情況下,我們只需要瞭解以”Com”開頭的指令

  show session status like ‘Com%’:顯示當前的連接的統計結果

  show global status like ‘Com%’ :顯示自資料庫上次啟動至今的統計結果

  註:預設是session級別的

  其中Com_XXX表示XXX語句所執行的次數。
重點註意:Com_select,Com_insert,Com_update,Com_delete通過這幾個參數,可以容易地瞭解到當前資料庫的應用是以插入更新為主還是以查詢操作為主,以及各類的SQL大致的執行比例是多少。

  另外,還有幾個參數需要註意下:

  show status like ‘Connections’// 試圖連接MySQL伺服器的次數

  show status like ‘Uptime’//伺服器工作的時間(單位秒)

  show status like ‘Slow_queries’//慢查詢的次數 (預設是10秒中就當做是慢查詢,如下圖所示)

  

  a) 如何查詢mysql的慢查詢時間

    Show variables like 'long_query_time';

  b) 修改mysql 慢查詢時間

    set long_query_time=2//如果查詢時間超過2秒就算作是慢查詢

2. 定位執行效率較低的SQL語句(dql出現問題的概率較dml的大)

  問題是:如何在一個項目中,找到慢查詢的select語句?

  答案:mysql支持把慢查詢語句記錄到日誌文件中。程式員需要修改php.ini的配置文件,預設情況下,慢查詢記錄是不開啟的。

  開啟慢查詢記錄的步驟:

  打開 my.ini ,找到 [mysqld] 在其下麵添加

  long_query_time = 2

  log-slow-queries = D:/mysql/logs/slow.log #設置把日誌寫在那裡,可以為空,系統會給一個預設的文件

     例子:我們數據表中有1千萬條的數據量

  DQL語句:SELECT * FROM order_copy WHERE id=12345;

  

  查詢耗時:19s>2s,所以mysql會將該條select語句記錄到慢查詢日誌中

  SELECT * FROM order_copy WHERE id=12345的執行時間:

  添加索引前:19s

  添加索引後:0.08s

3.通過explain分析低效率的SQL語句的執行情況

  使用explain分析該dql語句:

EXPLAIN SELECT * FROM order_copy WHERE id=12345
會產生如下信息:
select_type:表示查詢的類型。
table:輸出結果集的表
type:表示表的連接類型(system和const為佳)
possible_keys:表示查詢時,可能使用的索引
key:表示實際使用的索引
key_len:索引欄位的長度
rows:掃描的行數
Extra:執行情況的描述和說明

註意:要儘量避免讓type的結果為all,extra的結果為:using filesort

4.確定問題並採取相應的優化措施

  • 常用的優化措施是添加索引。添加索引,我們不用加記憶體,不用改程式,不用調sql,只要執行個正確的’create index’,查詢速度就可能提高百倍千倍。但是天下沒有免費的午餐,查詢速度的提高是以插入、更新、刪除的速度為代價的,這些寫操作,增加了大量的I/O。

例如:給欄位id添加索引:

ALTER TABLE order_copy ADD PRIMARY KEY(id)

給1千萬的數據添加primary key 需要耗時: 428秒(7分鐘)

EXPLAIN SELECT * FROM order_copy WHERE id=12345

正是因為給id添加了索引,才使得rows的結果為1

但是索引並不是可以隨便添加的,以下幾種情況需牢記在心:

  • 較頻繁的作為查詢條件欄位應該創建索引

    select * from order_copy where id = $id

  • 唯一性太差的欄位不適合單獨創建索引,即使頻繁作為查詢條件

   select * from order_copy where sex=’女’

  • 更新非常頻繁的欄位不適合創建索引

    select * from order_copy where order_state=’未付款’

  • 不會出現在WHERE子句中欄位不該創建索引

索引的類型:

  • PRIMARY 索引      => 在主鍵上自動創建
  • INDEX 索引          => 就是普通索引
  • UNIQUE 索引        => 相當於INDEX + Unique
  • FULLTEXT            => 只在MYISAM 存儲引擎支持, 目的是全文索引,在內容系統中用的多, 在全英文網站用多(英文詞獨立). 中文數據不常用,意義不大 國內全文索引通常 使用 sphinx 來完成.

索引的使用

  • 建立索引 create [UNIQUE|FULLTEXT]  index index_name on tbl_name (col_name [(length)] [ASC | DESC] , …..);
    alter table table_name ADD INDEX [index_name] (index_col_name,...)

    添加主鍵(索引) ALTER TABLE 表名 ADD PRIMARY KEY(列名,..); 聯合主鍵

  • 刪除索引 DROP INDEX index_name ON tbl_name;
    alter table table_name drop index index_name;
  • 刪除主鍵(索引)比較特別: alter table t_b drop primary key;
  • 查詢索引(均可) show index from table_name;
    show keys from table_name;
    desc table_Name;

相關資料:

explain的使用:http://www.cnblogs.com/you-yang/archive/2012/01/18/2325841.html


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 原文地址:http://docode.top/Article/Detail/10002 目錄: 1、Http協議上傳文件(以圖片為例)請求報文體內容格式 2、完整版HttpWebRequest模擬上傳文件請求報文內容封裝 3、asp.net(c#)使用HttpWebRequest攜帶請求參數模擬上傳 ...
  • 前言 用過Lucene.net的都知道,我們自己搭建索引伺服器時和解決搜索匹配度的問題都用到過盤古分詞。其中包含一個詞典。 那麼既然用到了這種國際化的框架,那麼就避免不了中文分詞。尤其是國內特殊行業比較多。比如油田系統從勘探、打井、投產等若幹環節都涉及一些專業辭彙。 再像電商,手機、手機配件、筆記本 ...
  • Arigis for WPF 標繪 箭頭 ArcGISPlotSilverlightAPI ...
  • 至2002微軟公司推出.NET平臺已近15年,在互聯網快速迭代的浪潮中,許多語言已被淘汰,同時也有更多新的語言涌現,但 .Net 依然堅挺的站在系統開發平臺的一線陣營中 ...
  • 先給大家介紹一個開源工具Sigar 官網:http://sigar.hyperic.com/ API: http://www.hyperic.com/support/docs/sigar/index-all.html(由於是英文的,英文不好的可以用谷歌瀏覽器的翻譯功能,直接轉換為簡體中文進行閱讀) ...
  • 1、python的moudles文件中__all__作用 Python的moudle是很重要的一個概念,我看到好多人寫的moudle里都有一個__init__.py文件。有的__init__.py中是空白,有的卻會有__all__參數。搜索了下總結下__all__參數的作用。 如果其他頁面impor ...
  • 一、線程 多任務可以由多進程完成,也可以由一個進程內的多線程完成,一個進程內的所有線程,共用同一塊記憶體python中創建線程比較簡單,導入threading模塊,下麵來看一下代碼中如何創建多線程。 主線程從上到下執行,創建5個子線程,列印出'start',然後等待子線程執行完結束,如果想讓線程要一個 ...
  • 先看一個慄子,看看能不能找出來裡面的錯誤: 運行一下,看一下報錯結果: 對的,是一個ClassCastException,這是一個編譯器聲稱的轉換,因此一般會保證成功,但是我嘛在這個慄子中忽略了一條編譯器的警告,就會為此而付出代價。 但是,如果用unsafeAdd(List<Object> list ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...