目錄
索引是什麼?
#索引的結構?
 
#索引的分類
現有一張user表,其索引如下所示
索引使用规范(索引失效分析)
例子总结:
首頁 資料庫 mysql教程 MySQL索引及優化的知識點有哪些

MySQL索引及優化的知識點有哪些

Jun 02, 2023 pm 10:30 PM
mysql

索引是什麼?

  • 索引是幫助MySQL進行高效率查詢的一種資料結構。好比一本書的目錄,能加快查詢的速度

#索引的結構?

索引可以有B-Tree索引,Hash索引。索引是在儲存引擎中實現的

InnoDB / MyISAM 僅支援B-Tree索引

Memory/Heap 支援B-Tree索引和Hash索引

  • #B-Tree

    B-Tree是一種非常適合用於磁碟操作的資料結構。它是一棵多路平衡查找樹。其高度一般在2-4,其非葉子節點,葉子節點,都會儲存資料。其所有的葉子節點,都在同一層。下圖是一顆B-Tree

MySQL索引及優化的知識點有哪些

  • # B Tree:B 樹是在B-Tree基礎上的一種最佳化.它和B樹的主要區別在於:B 樹的資料全部儲存在葉子節點中,且葉子節點被一個鍊錶串了起來。下圖是一顆B 樹

MySQL索引及優化的知識點有哪些

InnoDB中一個頁的大小為16KB(一個頁即B 樹上的節點),若表的主鍵為INT,大小為4位元組,那一個節點也能夠儲存4K個鍵值,假設指標和鍵值都佔相同大小,那麼高度為3的B 樹,第二層有2048個節點,第三層的葉子節點數為2048*2048 = 4194304,一個節點為16KB,則總共可容納67108864KB,即65536MB,即64G的資料。

由於葉子節點是被一個鍊錶串起來的,所以若order by 索引列,則預設已經是排好序的,所以效率會很高。

  • MyISAM索引
    MyISAM的索引和資料是分開存放的。在MyISAM的主鍵索引中,B 樹葉子節點裡,存的是記錄的位址,故MyISAM透過索引查詢,需要經過2次IO

MySQL索引及優化的知識點有哪些



MySQL索引及優化的知識點有哪些

MySQL索引及優化的知識點有哪些


##MyISAM的輔助索引和主鍵索引一樣,唯一的區別是,輔助索引中的key可以重複,而主鍵索引的key不能重複

InnoDB索引
    InnoDB的資料和索引是存放在一起的,又稱為聚集索引。資料透過主鍵索引,存放在主鍵索引B 樹的葉子節點上。
  • InnoDB主鍵索引,資料已經包含在了葉子節點中,即索引和資料存放在一起,是為聚集索引。


  •  InnoDB的輔助索引,葉子節點中存的是主鍵值,而不是位址。走輔助索引,需要檢索2次。


    InnoDB和MyISAM索引的區別:
  • InnoDB使用聚集索引,其主鍵索引葉子節點中直接儲存了數據,而其輔助索引中葉子節點存的是主鍵的值

MyISAM使用非聚集索引,資料和索引不在同一個檔案中,其主鍵索引中葉子節點上存的是該行記錄所在的位址,其輔助索引中葉子節點上存的也是記錄所在的位址,只是輔助索引的key可以重複,而主鍵索引的key不能重複

 

  • 問題

  • InnoDB為什麼不使用過長的欄位做主鍵

    過長的主鍵,會使得輔助索引所佔空間變得很大
    • #為什麼推薦InnoDB使用自增主鍵
    • 若使用自增主鍵,則每次插入新的記錄,就會順序的將新記錄添加到當前索引節點的後續位置,一頁寫滿了,才會進行開闢新的一頁,這樣使得索引結構很緊湊,且每次插入時不需要移動已有數據,非常有效率。而如果不使用自增主鍵,則每次插入新記錄時,都要選擇一個插入位置,並且可能需要移動數據,使得效率不高,且索引結構不緊湊

  • 為什麼要用B 樹,不用B樹

    #########存在哪一個存在哪? ############索引本身也比較大,通常會儲存在磁碟中,索引和資料可能是分開存放的(MyISAM的非聚集索引),也可能是一起存放的(InnoDB的聚集索引)############索引的優缺點?###########################降低IO成本,提高資料查詢效率############降低排序成本(被索引的列會自動排序,使用order by 效率會提高很多)############ ###缺點###
    • 索引會額外佔據儲存空間

    • #索引會降低更新表資料的效率。進行增刪改操作時,不僅要保存數據,還要更新對應的索引

#索引的分類

  • ##單列索引

    • 主鍵索引

    • 唯一索引

    • 普通索引

  • #組合索引

 索引使用

  • 建立索引

  •  CREATE INDEX index_name ON table_name(col_name);
    -- 或者
    ALTER TABLE table_name ADD INDEX index_name(col_name)
    登入後複製
  • 刪除索引

  • DROP INDEX index_name ON table_name;
    登入後複製
  • 需要建立索引的場景

    • 頻繁作為查詢條件的列,需建索引

    • 多表關聯中,關聯字段需建置索引

    • ##查詢中排序的字段,需建立索引
    不適用索引的場景
    • #寫入多讀少的表,不適合用於建立索引
    • 頻繁更新的字段,不適合用於建索引
    #explain執行計劃

現有一張user表,其索引如下所示

MySQL索引及優化的知識點有哪些其中name,age,address 三個欄位作為一個組合索引

可以使用explain對某個SQL語句進行效能分析

explain select * from user where name = 'am';
登入後複製

MySQL索引及優化的知識點有哪些

possible_keys

#可能用到的索引
key
實際用到的索引
key_len
用於查詢的索引的長度
ref
#如果是等值查詢,這裡會是const
rows
預計需要掃描的行數(不是精確值)
extra
#額外信息,如

    using where
  • 表示儲存引擎傳回的結果,還需要在SQL Layer層過濾


  • using index
  • 表示不需要回表查詢,一般在使用了覆蓋索引時會是這個值。覆蓋索引指的是,select中的列,全是索引列。不需要回表查詢指的是,直接走輔助索引,就能拿到索引列的值,不需要再去主鍵索引上取記錄了


  • using index condition
  • MySQL 5.6.x之後支援ICP特性(Index Condition Pushdown),可以把檢查條件下推到儲存引擎層,不符合條件的記錄,直接不讀取,而不是像原來一樣,先讀取出來,再在SQL Layer層過濾,這樣減少了儲存引擎層掃描的行數


MySQL索引及優化的知識點有哪些

    #using filesort
  • 排序時無法用到索引


type

    : 表中只有1行數據,或空表
  • const : 使用唯一索引或主鍵索引,且用where等值查詢,傳回記錄是1行,又叫唯一索引掃描

MySQL索引及優化的知識點有哪些

    ref : 針對非唯一索引,使用等值where條件,或最左前綴規則的查詢。
  • 以下是滿足了最左前綴規則,也就是對idx_name_age_add來說,滿足了最左前綴,第一個索引為name

MySQL索引及優化的知識點有哪些

    range:索引範圍掃描,常見於>,<,between,in,like等查詢

MySQL索引及優化的知識點有哪些

MySQL索引及優化的知識點有哪些注意like時,通配符%不能放在開頭,否則會導致全表掃描

MySQL索引及優化的知識點有哪些

##index : 沒有完全符合上索引,但不用回表查詢的

MySQL索引及優化的知識點有哪些

MySQL索引及優化的知識點有哪些

all : 全表掃描,然後在SQL Layer層過濾符合要求的記錄

    索引使用规范(索引失效分析)

    1. 全值匹配
      在索引列上使用等值查询

    explain select * from user where name = &#39;y&#39; and age = 15;
    登入後複製

    MySQL索引及優化的知識點有哪些

    2. 最左前缀

    组合索引中,查询条件要从组合索引的最左列开始,如上述example中组合索引idx_name_age_add,是建立在三个列name,age,address的,若跳过name,直接用age查询,则会变为全表扫描

    explain select * from user where age = 15;
    登入後複製

    MySQL索引及優化的知識點有哪些

    3. 不要在索引列上做计算

    4. 范围条件右侧的索引列会失效

    MySQL索引及優化的知識點有哪些

    看到第一个SQL语句,没有用上addresss索引

    5. 尽量使用覆盖索引

    explain select name,age from user where name = &#39;y&#39; and age = 1;
    登入後複製

    可以避免回表查询

    6. 索引字段不要使用不等(!= 或 ),不要判断null(is null/ is not null)
    会导致索引失效,转为全表扫描

    MySQL索引及優化的知識點有哪些

    MySQL索引及優化的知識點有哪些

    7. 索引字段上使用like时,不要以%开头

    MySQL索引及優化的知識點有哪些

    8. 索引字段如果是字符串,记得加单引号

    MySQL索引及優化的知識點有哪些

    9. 索引字段不要用or

    MySQL索引及優化的知識點有哪些

    例子总结:

    MySQL索引及優化的知識點有哪些

    以上是MySQL索引及優化的知識點有哪些的詳細內容。更多資訊請關注PHP中文網其他相關文章!

    本網站聲明
    本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

    熱AI工具

    Undresser.AI Undress

    Undresser.AI Undress

    人工智慧驅動的應用程序,用於創建逼真的裸體照片

    AI Clothes Remover

    AI Clothes Remover

    用於從照片中去除衣服的線上人工智慧工具。

    Undress AI Tool

    Undress AI Tool

    免費脫衣圖片

    Clothoff.io

    Clothoff.io

    AI脫衣器

    Video Face Swap

    Video Face Swap

    使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

    熱工具

    記事本++7.3.1

    記事本++7.3.1

    好用且免費的程式碼編輯器

    SublimeText3漢化版

    SublimeText3漢化版

    中文版,非常好用

    禪工作室 13.0.1

    禪工作室 13.0.1

    強大的PHP整合開發環境

    Dreamweaver CS6

    Dreamweaver CS6

    視覺化網頁開發工具

    SublimeText3 Mac版

    SublimeText3 Mac版

    神級程式碼編輯軟體(SublimeText3)

    MySQL:世界上最受歡迎的數據庫的簡介 MySQL:世界上最受歡迎的數據庫的簡介 Apr 12, 2025 am 12:18 AM

    MySQL是一種開源的關係型數據庫管理系統,主要用於快速、可靠地存儲和檢索數據。其工作原理包括客戶端請求、查詢解析、執行查詢和返回結果。使用示例包括創建表、插入和查詢數據,以及高級功能如JOIN操作。常見錯誤涉及SQL語法、數據類型和權限問題,優化建議包括使用索引、優化查詢和分錶分區。

    MySQL的位置:數據庫和編程 MySQL的位置:數據庫和編程 Apr 13, 2025 am 12:18 AM

    MySQL在數據庫和編程中的地位非常重要,它是一個開源的關係型數據庫管理系統,廣泛應用於各種應用場景。 1)MySQL提供高效的數據存儲、組織和檢索功能,支持Web、移動和企業級系統。 2)它使用客戶端-服務器架構,支持多種存儲引擎和索引優化。 3)基本用法包括創建表和插入數據,高級用法涉及多表JOIN和復雜查詢。 4)常見問題如SQL語法錯誤和性能問題可以通過EXPLAIN命令和慢查詢日誌調試。 5)性能優化方法包括合理使用索引、優化查詢和使用緩存,最佳實踐包括使用事務和PreparedStatemen

    apache怎麼連接數據庫 apache怎麼連接數據庫 Apr 13, 2025 pm 01:03 PM

    Apache 連接數據庫需要以下步驟:安裝數據庫驅動程序。配置 web.xml 文件以創建連接池。創建 JDBC 數據源,指定連接設置。從 Java 代碼中使用 JDBC API 訪問數據庫,包括獲取連接、創建語句、綁定參數、執行查詢或更新以及處理結果。

    為什麼要使用mysql?利益和優勢 為什麼要使用mysql?利益和優勢 Apr 12, 2025 am 12:17 AM

    選擇MySQL的原因是其性能、可靠性、易用性和社區支持。 1.MySQL提供高效的數據存儲和檢索功能,支持多種數據類型和高級查詢操作。 2.採用客戶端-服務器架構和多種存儲引擎,支持事務和查詢優化。 3.易於使用,支持多種操作系統和編程語言。 4.擁有強大的社區支持,提供豐富的資源和解決方案。

    docker怎麼啟動mysql docker怎麼啟動mysql Apr 15, 2025 pm 12:09 PM

    在 Docker 中啟動 MySQL 的過程包含以下步驟:拉取 MySQL 鏡像創建並啟動容器,設置根用戶密碼並映射端口驗證連接創建數據庫和用戶授予對數據庫的所有權限

    MySQL的角色:Web應用程序中的數據庫 MySQL的角色:Web應用程序中的數據庫 Apr 17, 2025 am 12:23 AM

    MySQL在Web應用中的主要作用是存儲和管理數據。 1.MySQL高效處理用戶信息、產品目錄和交易記錄等數據。 2.通過SQL查詢,開發者能從數據庫提取信息生成動態內容。 3.MySQL基於客戶端-服務器模型工作,確保查詢速度可接受。

    laravel入門實例 laravel入門實例 Apr 18, 2025 pm 12:45 PM

    Laravel 是一款 PHP 框架,用於輕鬆構建 Web 應用程序。它提供一系列強大的功能,包括:安裝: 使用 Composer 全局安裝 Laravel CLI,並在項目目錄中創建應用程序。路由: 在 routes/web.php 中定義 URL 和處理函數之間的關係。視圖: 在 resources/views 中創建視圖以呈現應用程序的界面。數據庫集成: 提供與 MySQL 等數據庫的開箱即用集成,並使用遷移來創建和修改表。模型和控制器: 模型表示數據庫實體,控制器處理 HTTP 請求。

    centos7如何安裝mysql centos7如何安裝mysql Apr 14, 2025 pm 08:30 PM

    優雅安裝 MySQL 的關鍵在於添加 MySQL 官方倉庫。具體步驟如下:下載 MySQL 官方 GPG 密鑰,防止釣魚攻擊。添加 MySQL 倉庫文件:rpm -Uvh https://dev.mysql.com/get/mysql80-community-release-el7-3.noarch.rpm更新 yum 倉庫緩存:yum update安裝 MySQL:yum install mysql-server啟動 MySQL 服務:systemctl start mysqld設置開機自啟動

    See all articles