• <noscript id="e0iig"><kbd id="e0iig"></kbd></noscript>
  • <td id="e0iig"></td>
  • <option id="e0iig"></option>
  • <noscript id="e0iig"><source id="e0iig"></source></noscript>
  • MySQL基礎筆記(四) 索引

    一、什么是索引

    索引(Index),可以看作一個指針,指向表里的數據。當數據庫沒有索引時,查找信息通常是全表掃描;使用了索引,它就會直接引導到數據在表里的準確物理位置。

    • 優點:索引的主要目的是提高數據檢索的性能,在數據量比較大時尤其明顯。

    • 缺點

      1. 索引通常與相應的表是分開保存的,索引也會占據物理存儲空間,而且可能比表本身還大。
      2. 索引的維護(索引項的添加和刪除)有時間消耗,會影響數據檢索的速度。

    當為字段添加了索引后,索引里記錄了與被索引字段相關聯的位置值。當表里添加新數據時,索引里也會添加新項。如下圖所示: 


     

    假設執行

    SELECT * FROM table_name WHERE name='SMITH';
    • 1
    • 1

    由于 where 條件里的 name 字段已經設置了索引,所以會首先在索引里搜索'SMITH',找到以后直接返回被搜索數據在表里的實際位置。

    二、創建索引

    創建索引使用CREATE INDEX命令或者ALTER TABLE...ADD...命令。數據庫里的表可以創建多種類型的索引。

    1. 單字段索引

    單字段索引是基于一個字段創建的:

    CREATE INDEX index_name ON table_name(column_name);
    • 1
    • 1

    如果某個字段經常在 where 子句作為單獨的查詢條件,那么它的單字段索引是最有效的。

    2. 唯一索引

    唯一索引不允許被索引字段具有重復值,除此之外,它與普通索引的功能一樣。

    CREATE UNIQUE INDEX index_name ON table_name(column_name);
    • 1
    • 1

    唯一索引用于改善性能和保證數據完整性。

    3. 組合索引

    組合索引是基于兩個或多個字段創建的:

    CREATE INDEX index_name ON table_name(column1, column2);
    • 1
    • 1

    如果經常在where子句里聯合使用兩個或多個字段進行查詢,可以考慮創建組合索引。

    4. 隱含索引

    隱含索引是數據庫服務程序在創建對象時自動創建的。比如,數據庫會為主鍵約束唯一性約束自動創建索引。

    為什么給主鍵約束和唯一性約束自動創建索引?

    主鍵約束和唯一性約束都要求字段的每個值都唯一。當用戶向表中添加新記錄時,為了有效地檢查新值在成百上千的記錄里是否唯一,對應的字段必須被索引。

    三、刪除索引

    MySQL中刪除索引使用ALTER TABLE或者DROP INDEX命令。兩者的功能是一樣的,事實上,DROP INDEX語句在內部被映射到一個ALTER TABLE語句中。

    方法一:

    ALTER TABLE table_name DROP INDEX index_name;
    • 1
    • 1

    方法二:

    DROP INDEX index_name ON table_name;
    • 1
    • 1

    四、何時(不)應該使用索引

    考慮使用索引的情況:

    1. 一般來說,大多數用于表結合的字段都應該設置索引。比如,外鍵經常用于與父表的結合,適合設置索引。

    2. 經常在order bygroup by里引用的字段應該考慮設置索引,因為索引會自動進行排序,簡化了實際的排序操作,提高了輸出結果的速度。

    3. 具有大量唯一值得字段,或是在where子句里會返回很小部分記錄的字段,都可以考慮設置索引。

    索引的初衷是提高數據檢索的性能,但不要認為使用索引就能解決所有的問題,在一些情況下索引可能根本不會改善性能而只是占據磁盤空間。

    1. 索引不應該用于小規模的表。

    2. 當字段在where子句里作為條件會返回表里的大部分記錄時,該字段不適合設置索引。

    3. 包含大量NULL值的字段不應該設置索引。索引對在不同記錄中包含不同數據的字段特別有效,字段中過多的NULL值會嚴重影響索引的運行效率。

    4. 經常被更新的字段不應該設置索引。因為對索引的維護會變得很繁重。
    版權聲明:本文為qq_25543685原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接和本聲明。
    本文鏈接:https://blog.csdn.net/qq_25543685/article/details/73294342

    智能推薦

    電腦空間不夠了?教你一個小秒招快速清理 Docker 占用的磁盤空間!

    Docker 很占用空間,每當我們運行容器、拉取鏡像、部署應用、構建自己的鏡像時,我們的磁盤空間會被大量占用。 如果你也被這個問題所困擾,咱們就一起看一下 Docker 是如何使用磁盤空間的,以及如何回收。 docker 占用的空間可以通過下面的命令查看: TYPE 列出了docker 使用磁盤的 4 種類型: Images:所有鏡像占用的空間,包括拉取下來的鏡像,和本地構建的。 Con...

    requests實現全自動PPT模板

    http://www.1ppt.com/moban/ 可以免費的下載PPT模板,當然如果要人工一個個下,還是挺麻煩的,我們可以利用requests輕松下載 訪問這個主頁,我們可以看到下面的樣式 點每一個PPT模板的圖片,我們可以進入到詳細的信息頁面,翻到下面,我們可以看到對應的下載地址 點擊這個下載的按鈕,我們便可以下載對應的PPT壓縮包 那我們就開始做吧 首先,查看網頁的源代碼,我們可以看到每一...

    Linux C系統編程-線程互斥鎖(四)

    互斥鎖 互斥鎖也是屬于線程之間處理同步互斥方式,有上鎖/解鎖兩種狀態。 互斥鎖函數接口 1)初始化互斥鎖 pthread_mutex_init() man 3 pthread_mutex_init (找不到的情況下首先 sudo apt-get install glibc-doc sudo apt-get install manpages-posix-dev) 動態初始化 int pthread_...

    統計學習方法 - 樸素貝葉斯

    引入問題:一機器在良好狀態生產合格產品幾率是 90%,在故障狀態生產合格產品幾率是 30%,機器良好的概率是 75%。若一日第一件產品是合格品,那么此日機器良好的概率是多少。 貝葉斯模型 生成模型與判別模型 判別模型,即要判斷這個東西到底是哪一類,也就是要求y,那就用給定的x去預測。 生成模型,是要生成一個模型,那就是誰根據什么生成了模型,誰就是類別y,根據的內容就是x 以上述例子,判斷一個生產出...

    猜你喜歡

    styled-components —— React 中的 CSS 最佳實踐

    https://zhuanlan.zhihu.com/p/29344146 Styled-components 是目前 React 樣式方案中最受關注的一種,它既具備了 css-in-js 的模塊化與參數化優點,又完全使用CSS的書寫習慣,不會引起額外的學習成本。本文是 styled-components 作者之一 Max Stoiber 所寫,首先總結了前端組件化樣式中的最佳實踐原則,然后在此基...

    基于TCP/IP的網絡聊天室用Java來實現

    基于TCP/IP的網絡聊天室實現 開發工具:eclipse 開發環境:jdk1.8 發送端 接收端 工具類 運行截圖...

    19.vue中封裝echarts組件

    19.vue中封裝echarts組件 1.效果圖 2.echarts組件 3.使用組件 按照組件格式整理好數據格式 傳入組件 home.vue 4.接口返回數據格式...

    劍指Offer39-調整數組順序使奇數位于偶數前面

    一開始想著用冒泡排序的方法來做,但是bug還是很多,后來看了評論區答案,發現直接空間換時間是最簡單的,而且和快排的寫法是類似的。...

    【一只蒟蒻的刷題歷程】【藍橋杯】歷屆試題 九宮重排 (八數碼問題:BFS+集合set)

    資源限制 時間限制:1.0s 內存限制:256.0MB 問題描述 如下面第一個圖的九宮格中,放著 1~8 的數字卡片,還有一個格子空著。與空格子相鄰的格子中的卡片可以移動到空格中。經過若干次移動,可以形成第二個圖所示的局面。 我們把第一個圖的局面記為:12345678. 把第二個圖的局面記為:123.46758 顯然是按從上到下,從左到右的順序記錄數字,空格記為句點。 本題目的任務是已知九宮的初態...

    精品国产乱码久久久久久蜜桃不卡