MySQL——適合不適合創建索引的情況

那些情況適合創建索引

1、字段的數值具有唯一性的限制

索引本身可以起到約束的作用,比如唯一索引、主鍵索引都是可以起到唯一性約束的,因此在我們的數據表中,如果某個字段是唯一性的,就可以直接創建唯一性索引,或者主鍵索引。這樣可以更快速地通過該索引來確定某條記錄。

例如,學生表中學號是具有唯一性的字段,為該字段建立唯一性索引可以很快確定某個學生的信息,如果使用姓名的話,可能存在同名現象,從而降低查詢速度。

  • 業務上具有唯一特性的字段,即使是組合字段,也必須建成唯一索引。(來源:Alibaba)
  • 說明:不要以為唯一索引影響了insert速度,這個速度損耗可以忽略,但提高查找速度是明顯的。
2、頻繁作為WHERE查詢條件的字段

某個字段在SELECT語句的WHERE條件中經常被使用到,那么就需要給這個字段建立索引了。尤其是在數據量大的情況下,創建普通索引就可以大幅提升數據查詢的效率。

3、經常GROUP BY 和 ORDER BY 的列

索引就是讓數據按照某種順序進行存儲或檢索,因此當我們使用GROUP BY 對數據進行分組查詢,或者使用ORDER BY 對數據進行排序的時候,就需要對分組或者排序的字段進行索引。如果待排序的列有多個,那么可以在這些列上建立組合索引。

4、UPDATE、DELETE的WHERE條件列
5、DISTINCT字段需要創建索引
6、多表 JOIN連接操作時,創建索引注意事項

首先,連接表的數據盡量不要超過3張,因為每增加一張表就相當于增加了一次嵌套的循環,數量級增長會非常快,嚴重影響查詢的效率。

其次,對WHERE條件創建索引,因為WHERE才是對數據條件的過濾。如果在數據量非常打的情況下,沒有WHERE條件過濾是非常可怕的。

最后,對用于連接的字段創建索引,并且該字段在多張表的類型必須一致。比如course_id在student_info表和course表都為int(11)類型,而不能一個為int另外一個為varchar類型。

7、使用類型小的創建索引

我們這里所說的類型大小指的就是該類型表示的數據范圍大小。

我們在定義表結構的時候要顯式的指定列的類型,以整數類型為例,有TINYINT、MEDIUMINT、INT、BIGINT等,它們占用的資源空間的依次遞增,能表示的整數范圍當然也是依次遞增。如果我們想要對某個整數列建立索引的話,在表示的整數范圍允許的情況下,盡量讓索引列使用較小的類型,比如我們能使用INT就不要使用BIGINT,能使用MEDIUMINT就不要使用INT。這是因為:

  • 數據類型小,在查詢時進行的比較操作越快
  • 數據類型越小,索引占用的存儲空間就越小,在一個數據頁內就可以放下更多的記錄,從而減少磁盤I/O帶來的性能損耗,也就意味著可以把更多的數據頁緩存在內存中,從而加快讀寫效率。

這個建議對于表的主鍵來說更加適用,因為不僅是聚簇索引會存儲主鍵值,其他所有的二級索引的節點處都會存儲一份記錄的主鍵值,如果主鍵使用更小的數據類型,也就意味著節省更多的存儲空間和更高效的I/O。

8、使用字符串前綴創建索引
9、區分度高(散列性高)的列適合作為索引
10、使用最頻繁的列放到聯合索引的左側

這樣也可以較少的建立一些索引。同時,由于最左前綴原則,可以增加聯合索引的使用率。

11、在多個字段都要創建索引的情況下,聯合索引優于單值索引

限制索引的數目

在實際工作中,我們也需要注意平衡,索引的數目不是越多越好。我們需要限制每張表上的索引數量,建議單表索引數量不超過6個。原因:

  • 每個索引都需要占用磁盤空間,索引越多,需要的磁盤空間越大。
  • 索引會影響INSERT、DELETE、UPDATE等語句的性能,因為表中的數據更改的同時,索引也會進行調整和更新,會造成負擔。
  • 優化器在選擇如何優化查詢時,會根據統一信息,對每一個可以用到的索引來進行評估,以生成出一個最好的執行計劃,如果同時有很多個索引都可以用于查詢,會增加MySQL優化器生成執行計劃時間,降低查詢性能。

那些情況不適合創建索引

1、在where中使用不到的字段,不要設置索引

WHERE條件(包括GROUP BY、ORDER BY)里用不到的字段不需要創建索引,索引的價值是快速定位,如果起不到定位的字段通常是不需要創建索引的。

2、數據量小的表最好不要使用索引

如果表記錄太少,比如少于1000個,那么是不需要創建索引的。表記錄太少,是否創建索引對查詢效率的影響并不大。甚至說,查詢花費的時間可能比遍歷索引的時間還要短,索引可能不會產生優化效果。

3、有大量重復數據的列上不要建立索引

在條件表達式中經常用到的不同值較多的列上建立索引,但字段中如果有大量重復數據,也不用創建索引。比如在學生表的性別字段上只有男與女兩個不同值,因此無需建立索引。如果建立索引,不但不會提高查詢效率,反而會嚴重降低數據更新速度。

舉例1:要在100萬行數據中查找其中的50萬行(比如性別為男的數據),一旦建立了索引,你需要先訪問50萬次索引,然后再訪問50萬次數據表,這樣加起來的開銷比不使用索引可能還要大。

4、避免對經常更新的表創建過多的索引

頻繁更新的字段不一定要創建索引,因為更新數據的時候,也需要更新索引,如果索引太多,在更新索引的時候也會造成負擔,從而影響效率。

5、不建議用無序的值作為索引

例如身份證、UUID(在索引比較時需要轉為ASCII,并且插入時可能造成頁分裂)、MD5、HASH、無序長字符串等。

6、刪除不再使用或者很少使用索引
7、不要定義冗余或重復的索引
1、冗余索引

有時候有意或無意的就對同一個列創建了多個索引,比如:index(a,b,c)相當于index(a),index(a,b),index(a,b,c)

我們知道,通過index(a,b,c)索引就可以對a列進行快速搜索,再創建一個專門針對a列的索引就算一個冗余索引,維護這個索引只會增加維護的成本,并不會對搜索有什么好處。

2、重復索引

比如學生表id即使主鍵,又給它定義為一個唯一索引,還給它定義一個普通索引,可是主鍵本身就是聚簇索引,所以定義唯一索引和普通索引是重復的,這種情況要避免。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/17340.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/17340.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/17340.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Nodejs 爬蟲 案例

1.安裝: npm install cheerio npm install axios2.介紹: 2.1 cheerio 特點和用途描述: HTML解析和操作:Cheerio 可以將 HTML 字符串加載到內存中,并將其轉換為一個可操作的 DOM 樹結構,從而可以方便地對…

AURIX TC3xx單片機介紹-啟動過程介紹1

從各個域控制器硬件解決方案來看,MPU可能來自多個供應商,有瑞薩,有NXP等,但對于MCU來說,基本都采用英飛凌TC3xx。 今天我們就來看一下TC3xx的啟動過程,主要包含如下內容: uC上電過程中,會經過一個上電時序,從復位狀態“脫離”出來;Boot Firmware是復位后第一個執行的…

使用 Effect 同步-09

有些組件需要與外部系統同步。例如,你可能希望根據 React state 控制非 React 組件、設置服務器連接或在組件出現在屏幕上時發送分析日志。Effects 會在渲染后運行一些代碼,以便可以將組件與 React 之外的某些系統同步。 簡單理解,就是需要操…

Python實現對Word文檔內容出現“重復標題”進行自動去重(4)

前言 本文是該專欄的第4篇,后面會持續分享Python辦公自動化干貨知識,記得關注。 在本專欄上一篇文章《Python實現對Word文檔內容出現“重復標題”進行自動去重(3)》中,筆者有詳細介紹使用python對word文檔內容的目標文本進行自動去重。只不過本文要介紹的“去重方法”與上…

計算機專業必考之計算機指令設計格式

計算機指令設計格式 例題: 1.設相對尋址的轉移指令占3個字節,第一字節為操作碼,第二,第三字節為相對偏移量, 數據在存儲器以低地址為字地址的存放方式。 每當CPU從存儲器取出一個字節時候,自動完成&…

正點原子[第二期]Linux之ARM(MX6U)裸機篇學習筆記-24.1,2 SPI驅動實驗-SPI協議介紹

前言: 本文是根據嗶哩嗶哩網站上“正點原子[第二期]Linux之ARM(MX6U)裸機篇”視頻的學習筆記,在這里會記錄下正點原子 I.MX6ULL 開發板的配套視頻教程所作的實驗和學習筆記內容。本文大量引用了正點原子教學視頻和鏈接中的內容。…

計算機組成原理易混淆知識點總結(持續更新)

目錄 1.機器字長,存儲字長與指令字長 2.指令周期,機器周期,時鐘周期 3.CPI,IPS,MIPS 4.翻譯程序和匯編程序 5.計算機體系結構和計算機組成的區別和聯系 6.基準程序執行得越快說明機器的性能越好嗎? 1.機器字長,存儲字長與指令字長 不同的機器三者…

AI智能體|扣子Coze文生圖功能接入微信公眾號

大家好,我是無界生長。 AI智能體|扣子Coze文生圖功能接入微信公眾號本文分享了如何將Coze平臺的文生圖功能接入微信公眾號的詳細操作流程,包括創建圖像流、創建并配置Bot、設置提示詞和開場白、調試、發布等步驟。如果看完還沒學會的話&…

網頁圖片加載慢的求解指南

網頁/圖片加載慢的求解指南 一、前言與問題描述 今天剛換上華為的HUAWEI AX3 Pro New,連上WIFI后測速雖然比平時慢,但是也不算太離譜,如下圖所示: 估計讀者們有也和作者一樣,還沒意識到事情的嚴重性😁。 …

08Django項目--用戶管理系統--查(前后端)

對應視頻鏈接點擊直達 TOC 一些朋友加我Q反饋,希望有每個階段的完整項目代碼,那從今天開始,我會上傳完整的項目代碼。 用戶管理,簡而言之就是用戶的增刪改查。 08項目點擊下載,可直接運行(含數據庫&…

PHP框架 Laravel

現在因為公司需求,需要新開一個Laravel框架的項目,毫無疑問,我又被借調過去了,最近老是被借調,有點陰郁,不過反觀來看,這也是好事,又可以復習和鞏固一下自己的知識點,接下…

大數據開發面試題【Spark篇】

115、Spark的任務執行流程 driver和executor,結構式一主多從模式, driver:spark的驅動節點,用于執行spark任務中的main方法,負責實際代碼的執行工作;主要負責:將代碼邏輯轉換為任務、在executo…

編譯qt5.15.2(mac/windows)的mysql驅動(附帶編譯好的文件)

文章目錄 0 背景1 編譯過程2 福利 0 背景 因為需要連接到mysql數據庫,所以需要連mysql驅動。 1 編譯過程 1,打開文件/Users/mac/Qt5.14.2/5.14.2/Src/qtbase/src/plugins/sqldrivers/sqldrivers.pro,注釋掉QMAKE_USE mysql; 如…

國產【Jetson Xavier NX】——從裸機到深度學習開發環境配置

1、設置系統從固態硬盤啟動 英偉達官方NX出廠是直接將SD卡(64/128G)燒錄系統作為系統盤使用,國產NX出廠是將系統配置在8G內存中,在后續使用中需配置大量開發包,故將系統設置為從固態硬盤啟動。 參考鏈接 https://blo…

vue3中使用svg圖標

安裝依賴 npm i vite-plugin-svg-icons -D vite.config.ts中添加配置 主要為指定svg圖標存放路徑以及命名方式 import { defineConfig } from vite import vue from vitejs/plugin-vue import { createSvgIconsPlugin } from vite-plugin-svg-icons import path from path;…

總結力學_3

參考: 陳曦<<力學講義>>http://ithatron.phys.tsinghua.edu.cn/downloads/mechanics.pdf 10 非慣性系 10.1 勻加速平動非慣性系 10.2 定軸勻速轉動非慣性系 可以更好刻劃總結力學_2的有心力運動、質點系的運動的工具! 11 線性系統 11.1 線性系統、11.2 受迫…

【深入理解Python中的裝飾器】

文章目錄 前言裝飾器的基本概念帶參數的裝飾器類作為裝飾器結論 前言 裝飾器是Python中一個非常強大且靈活的特性&#xff0c;它允許程序員在不修改原函數代碼的情況下&#xff0c;增加或修改函數的行為。裝飾器本質上是一個接受函數作為參數并返回一個新函數的函數。本文將深…

點擊登錄按鈕先檢測輸入框的規則檢測(vue組合式)

<template><el-form :model"user" :rules"rules" ref"loginForm" label-width"auto" style"max-width: 600px"><el-form-item label"用戶名" prop"name"><el-input v-model"…

【Linux-LCD 驅動】

Linux-LCD 驅動 ■ Framebuffer 簡稱 fb■ LCD 驅動程序編寫■ 1、LCD 屏幕 IO 配置■ 2、LCD 屏幕參數節點信息修改■ 3、LCD 屏幕背光節點信息■ 4、使能 Linux logo 顯示 ■ 設置 LCD 作為終端控制臺■ 1、設置 uboot 中的 bootargs■ 2、修改/etc/inittab 文件 ■ LCD 背光…

ROS的noetic版本

設置 sources.list 執行下面命令&#xff0c;設置從清華源下載 ROS 軟件包。 sudo sh -c echo "deb http://mirrors.tuna.tsinghua.edu.cn/ros/ubuntu/ $(lsb_release -sc) main" > /etc/apt/sources.list.d/ros-latest.list設置密鑰 sudo apt-key adv --keyse…