日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

mysql 分组占比_含泪整理MySQL索引

發布時間:2025/4/16 数据库 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 mysql 分组占比_含泪整理MySQL索引 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

索引優化分析

  • 性能下降SQL慢

    • 查詢語句寫的差

    • 索引失效

      • 單值索引

      • 多值索引

    • 關聯查詢太多join(設計缺陷或不得已的需求)

    • 服務器調優以及各個參數設置(緩沖、線程數等)

  • 執行時間長

  • 等待時間長

  • 常見通用的JOIN查詢

    • 共有的INNER JOIN

    • 左表的共有 LEFT JOIN

    • 右表的共有 RIGHT JOIN

    • 左邊獨有 where b.key is null

    • 全鏈接 full outer join

    • ab都沒用a.key is null or b.key is null

索引簡介

  • 是什么

    • 排好序。

    • 查詢快。

    • 數據庫系統還維護著滿足特定查找算法的數據結構。B+TREE索引(此處不展開討論)

    • 索引:是幫助MySQL高效獲取數據的數據結構,可以得到索引的本質。索引是一種數據結構。

    • 高效查詢,類似新華字段。

    • 排好序的快速查找數據結構。(order by …)

  • 優勢

    • 提高索引的檢索效率,降低數據庫的IO成本。

    • 通過數據進行排序,降低數據的排序成包,降低了cpu的消耗。

  • 劣勢

    • 實際上索引也是一張表,該表保存了主鍵索引字段,并指向實體表的數據,占空間。

    • 索引提高了查詢,但是降低了更新。

    • 提高效率的一個因素,如果有大數據量的表,花時間建立最優秀的索引,或者優化查詢。

  • MySQL索引分類

    • 單值索引

      • 一個索引只包含單個列,一個表可以有多個單列索引。

    • 唯一索引

      • 索引列的值必須唯一,但允許有空值。

    • 復合索引

      • 一個索引包含索格列

    • 基本語法

    • 哪些需要創建索引

      • 主鍵索引

      • 頻繁查詢

      • 外鍵管理

      • 組合索引

      • 排序字段

      • 統計或分組

    • 哪些情況不需要創建索引

      • 表記錄少

      • 300百萬就差不多開始優化

      • 經常增刪改的不創建索引

      • 重復的值

  • MySQL索引結構

    • BTree索引

    • Hash索引

    • full-text全文索引

    • R-TREE索引

性能分析

一、MySQL常見的性能瓶頸
  • cpu飽和

  • io內存

  • 硬件瓶頸,top,free,iostat,vmstat

  • 是什么

    • 模擬優化器執行的SQL查詢語句,從而知道MySQL是如何處理SQL語句的,分析查詢語句或者表結構。

  • 能干什么

    • Explain + sql

    • 表的讀取順序

    • 數據讀取操作的操作類型

    • 哪些索引可以被使用

    • 哪些哪些索引實際被使用

    • 表之間的引用

    • 每張表有多少行被優化器查詢

二、Explain每個字段的詳細描述
  • id

    • 數字大的優先級高。(derived衍生)

    • id不同,如果是子查詢,id的需要會遞增,id值越大優先級越高,先被執行。

    • id相同,執行順序從上往下

    • id相同與不同,同時存在。

  • select_type

    • 有哪些?

      • simple

        • 簡單的select查詢,查詢中不包含子查詢或者union

      • primary

        • 查詢中若包含任何復雜的子部分,最外層查詢則被標記為primary

      • subquery

        • 在select 或者where 列表中包含了子查詢

      • derived(衍生)

        • 在from列表中包含的子查詢被標記為derived,MySQL會遞歸執行這些子查詢,把結果放在臨時表里。

      • union

        • 若第二個select出現在union之后,則被標記為union。若union包含在from子句的子查詢中,外層select被標記為derived.

      • union result

        • 兩個union查詢的結果。

    • 查詢的類型,主要是用于區別普通查詢,聯合查詢,子查詢等復雜查詢

  • type

    • 類型有:all,index,arnge,ref,eq_ref,const,system,null

  • system

    • 表只有一行記錄,平時不會出現,忽略不計

  • const

    • 一次索引,用于比較primary 或者union 索引。因為只匹配一行記錄。例如將主鍵置于where列表,MySQL就能將該查詢轉換成一個常量

  • eq_ref

    • 唯一性索引掃描,對于每個索引鍵,表中只有一條記錄與之匹配。常見于主鍵或者唯一索引

  • ref

    • 非唯一性索引掃描,返回匹配某個單獨的所有行。本質上也是一種索引訪問,它返回所有匹配某個單獨值的行。可能會找到多個符合條件的行,所以屬于查找和掃描的混合體。

  • range

    • 只檢索給定范圍的行,使用一個索引來選擇行。key列顯示使用了哪個索引。一般就算在where語句中出現的between,<>,in,等的查詢。這種范圍掃描比全表掃描要好,因為它只需要開始結束于索引的兩個點,不用全表索引。

  • index

    • index與all區別為Index只遍歷索引樹。

  • all

    • 全表掃描

  • possible_keys

    • 可能用到的索引。一個,多個。

    • 不一定被實際查詢引用。

  • key

    • 實際使用到的索引。

    • 查詢中若使用到了全文索引

    • 覆蓋索引:查詢的字段和索引字段一一對應。(查詢列要被所建的索引覆蓋)

  • key_len

    • 索引使用的字節數。索引字段的最大可能的長度,不是實際。(越小越好)

  • ref

    • 顯示索引的那一列被使用。最好是常量

  • rows

    • 大致讀到的行數。

  • Extra

    • 在沒用group by 子句的情況下,基于索引優化min/max操作或者對用MyIAAM存儲引擎優化count()操作,不必等到執行階段再進行計算。查詢執行計劃生成階段即完成優化。

    • 表示使用了覆蓋索引,避免了訪問表的數據行。如果同時出現了using where,表明索引被用來執行索引鍵值的查找。如果沒用同時現象using where ,表明縮影用來讀取數據而非執行查詢動作。

    • 新建了內部的臨時表,常見于order by 和分組查詢group by

    • mysql會對數據使用一個外部的索引排序,而不是按照表內的索引順序進行讀取。mysql中無法利用索引完成的排序操作稱為文件排序。(排序未命中索引)

    • using firesort

    • sql+\G

    • using temporary

    • using index(還可以哦)

    • using where

    • using join buffer:使用了連接緩存

    • impossible where:不能獲取到任何元素

    • select tables optimized away

    • distinct:找到第一個匹配的元組后就收工。

  • 從最好到最差system>const>eq_ref>ref>i>range>index>all

  • 一般來說,保證查詢至少達到range級別,最好能達到ref

性能分析

一、索引分析

  • 單表索引

  • 兩張表

    • 左鏈接加到右表

    • 右鏈接加到左表

  • 三張表

    • 加到后面兩張表

  • 結論

    • 小結果集驅動大結果集

    • 優先優化內部循環

    • join buffer的設置

二、避免索引失效

  • 全值索引最好

  • 最左匹配法則

  • 不在索引列上做任何操作(計算,函數,類型轉換,會導致索引失效而轉向全表掃描)

  • 存儲引擎不能使用索引范圍條件右邊的列(范圍之后全失效)

  • 盡量使用覆蓋索引。不要select *

  • mysql在使用不等于(!=或者<>)的時候無法使用索引導致全表掃描

  • is null,is not null也無法使用索引(索引失效)(%加右邊)

    • 解決辦法:覆蓋索引。

  • like 以通配符開通(%aaa)索引也會失效,變成全表掃描

  • 字符串不加單引號索引失效

  • 少用or,用它來連接時會索引失效

我是失憶,一個熱愛技術的宅男,文章有任何問題您都可以在留言中指出。歡迎留言。
《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀

總結

以上是生活随笔為你收集整理的mysql 分组占比_含泪整理MySQL索引的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。