Mysq基礎

来源:http://www.cnblogs.com/yankun1991/archive/2017/06/14/7008240.html
-Advertisement-
Play Games

本文是之前看博客時候的記錄,忘記是哪位仁兄的了,在這隻做一次轉載: 常見誤區 count(1)和count(primary_key) 優於 count(*) 很多人為了統計記錄條數,就使用 count(1) 和 count(primary_key) 而不是 count(*) ,他們認為這樣性能更好, ...


本文是之前看博客時候的記錄,忘記是哪位仁兄的了,在這隻做一次轉載:

  • 常見誤區
    1. count(1)和count(primary_key) 優於 count(*)
很多人為了統計記錄條數,就使用 count(1) 和 count(primary_key) 而不是 count(*) ,他們認為這樣性能更好,其實這是一個誤區。對於有些場景,這樣做可能性能會更差,應為資料庫對 count(*) 計數操作做了一些特別的優化。
    1. count(column) 和 count(*) 是一樣的
這個誤區甚至在很多的資深工程師或者是 DBA 中都普遍存在,很多人都會認為這是理所當然的。實際上,count(column) 和 count(*) 是一個完全不一樣的操作,所代表的意義也完全不一樣。 count(column) 是表示結果集中有多少個column欄位不為空的記錄 count(*) 是表示整個結果集有多少條記錄
    1. select a,b from … 比 select a,b,c from … 可以讓資料庫訪問更少的數據量
這個誤區主要存在於大量的開發人員中,主要原因是對資料庫的存儲原理不是太瞭解。 實際上,大多數關係型資料庫都是按照行(row)的方式存儲,而數據存取操作都是以一個固定大小的IO單元(被稱作 block 或者 page)為單位,一般為4KB,8KB… 大多數時候,每個IO單元中存儲了多行,每行都是存儲了該行的所有欄位(lob等特殊類型欄位除外)。 所以,我們是取一個欄位還是多個欄位,實際上資料庫在表中需要訪問的數據量其實是一樣的。 當然,也有例外情況,那就是我們的這個查詢在索引中就可以完成,也就是說當只取 a,b兩個欄位的時候,不需要回表,而c這個欄位不在使用的索引中,需要回表取得其數據。在這樣的情況下,二者的IO量會有較大差異。
    1. order by 一定需要排序操作
我們知道索引數據實際上是有序的,如果我們的需要的數據和某個索引的順序一致,而且我們的查詢又通過這個索引來執行,那麼資料庫一般會省略排序操作,而直接將數據返回,因為資料庫知道數據已經滿足我們的排序需求了。 實際上,利用索引來優化有排序需求的 SQL,是一個非常重要的優化手段 延伸閱讀:MySQL ORDER BY 的實現分析 ,MySQL 中 GROUP BY 基本實現原理 以及 MySQL DISTINCT 的基本實現原理 這3篇文章中有更為深入的分析,尤其是第一篇
    1. 執行計劃中有 filesort 就會進行磁碟文件排序
有這個誤區其實並不能怪我們,而是因為 MySQL 開發者在用詞方面的問題。filesort 是我們在使用 explain 命令查看一條 SQL 的執行計劃的時候可能會看到在 “Extra” 一列顯示的信息。 實際上,只要一條 SQL 語句需要進行排序操作,都會顯示“Using filesort”,這並不表示就會有文件排序操作。 延伸閱讀:理解 MySQL Explain 命令輸出中的filesort,我在這裡有更為詳細的介紹
  • 基本原則
    1. 儘量少 join
MySQL 的優勢在於簡單,但這在某些方面其實也是其劣勢。MySQL 優化器效率高,但是由於其統計信息的量有限,優化器工作過程出現偏差的可能性也就更多。對於複雜的多表 Join,一方面由於其優化器受限,再者在 Join 這方面所下的功夫還不夠,所以性能表現離 Oracle 等關係型資料庫前輩還是有一定距離。但如果是簡單的單表查詢,這一差距就會極小甚至在有些場景下要優於這些資料庫前輩。
    1. 儘量少排序
排序操作會消耗較多的 CPU 資源,所以減少排序可以在緩存命中率高等 IO 能力足夠的場景下會較大影響 SQL 的響應時間。 對於MySQL來說,減少排序有多種辦法,比如:
  • 上面誤區中提到的通過利用索引來排序的方式進行優化
  • 減少參與排序的記錄條數
  • 非必要不對數據進行排序
  • 避免使用耗費資源的操作,帶有DISTINCT,UNION,MINUS,INTERSECT,ORDER BY的SQL語句會啟動SQL引擎 執行,耗費資源的排序(SORT)功能. DISTINCT需要一次排序操作, 而其他的至少需要執行兩次排序
 
您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 上一篇博文寫的是Picasso基本使用和源碼完全解析,Picasso的源碼閱讀起來還是很順暢的,然後就想到Glide框架,網上大家也都推薦使用這個框架用來載入圖片,正好我目前的寫作目標也是分析當前一些流行的框架源碼,那就也來解析下Glide的源碼吧,而且有了Picasso源碼的分析相信很快就搞定Gl... ...
  • 轉載文章地址:http://www.jianshu.com/p/27ba2759b221 ...
  • Block簡介 Block使用場景,可以在兩個界面的傳值,也可以對代碼封裝作為參數的傳遞等。用過GCD就知道Block的精妙之處。 Block是一種比較特殊的數據類型。它可以保存一段代碼,在合適的時候取出來調用。 Block的修飾 ARC情況下 1.如果用copy修飾Block,該Block就會存儲 ...
  • 前面說到groovy支持腳本和類,前面一節已將簡單說了腳本和類之間的關係,這一節主要介紹一下groovy中類的相關知識,即面向對象相關知識。 1.類型 1.1 原始類型 groovy中支持的原始數據類型與java相同,分別是boolean,char,short,int,long,float,doub ...
  • 1:下載tpcc-mysql的壓縮包,從下麵的網站進行下載 https://github.com/Percona-Lab/tpcc-mysql 也可直接從葉總博客直接下載: http://imysql.com/wp-content/uploads/2014/09/tpcc-mysql-src.tgz ...
  • 本文翻譯自:http://hadoop.apache.org/docs/r2.8.0/hadoop-project-dist/hadoop-hdfs/HdfsUserGuide.html 基於2.8.0文檔 1.目的 本文可以作為以下人員的入門指引:使用hdfs的用戶,或者僅僅使用分散式文件系統的用 ...
  • 本文只介紹在windows上的安裝和配置,其他安裝和配置請參見官方文檔 ES在windows上安裝需下載zip安裝包,解壓後bin目錄下有個 elasticsearch-service.bat 文件。運行此文件ES就會啟動服務。 ES的最新穩定版可以從這裡下載,其他版本可以從這裡找到。 Elasti ...
  • 背景 最近我們在azure portal 上開了幾台英文版的資料庫伺服器,因預設是開啟就安裝好對應的資料庫,所以存在一個實例排序規則的問題,需把整個實例都調整成Chinese_PRC_CI_AS,避免後續出現字元亂碼之類的問題。之前只是知道可以調整,未實際操作過,這次把實際操作步驟記錄一下,便於我們 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...