1. 程式人生 > >Mysql資料庫的索引分析

Mysql資料庫的索引分析

一、什麼是索引?
  索引用來快速地尋找那些具有特定值的記錄,所有MySQL索引都以B-樹的形式儲存。如果沒有索引,執行查詢時MySQL必須從第一個記錄開始掃描整個表的所有記錄,直至找到符合要求的記錄。表裡面的記錄數量越多,這個操作的代價就越高。如果作為搜尋條件的列上已經建立了索引,MySQL無需掃描任何記錄即可迅速得到目標記錄所在的位置。如果表有1000個記錄,通過索引查詢記錄至少要比順序掃描記錄快100倍。

二、索引的型別
MySQL提供多種索引型別供選擇:


普通索引
這是最基本的索引型別,而且它沒有唯一性之類的限制。普通索引可以通過以下幾種方式建立:
建立索引,例如CREATE INDEX <索引的名字> ON tablename (列的列表);
修改表,例如ALTER TABLE tablename ADD INDEX [索引的名字] (列的列表);
建立表的時候指定索引,例如CREATE TABLE tablename ( [...], INDEX [索引的名字] (列的列表) );


唯一性索引
這種索引和前面的“普通索引”基本相同,但有一個區別:索引列的所有值都只能出現一次,即必須唯一。唯一性索引可以用以下幾種方式建立:
建立索引,例如CREATE UNIQUE INDEX <索引的名字> ON tablename (列的列表);
修改表,例如ALTER TABLE tablename ADD UNIQUE [索引的名字] (列的列表);
建立表的時候指定索引,例如CREATE TABLE tablename ( [...], UNIQUE [索引的名字] (列的列表) );


主鍵
主鍵是一種唯一性索引,但它必須指定為“PRIMARY KEY”。如果你曾經用過AUTO_INCREMENT型別的列,你可能已經熟悉主鍵之類的概念了。主鍵一般在建立表的時候指定,例如“CREATE TABLE tablename ( [...], PRIMARY KEY (列的列表) ); ”。但是,我們也可以通過修改表的方式加入主鍵,例如“ALTER TABLE tablename ADD PRIMARY KEY (列的列表); ”。每個表只能有一個主鍵。


全文索引
MySQL從3.23.23版開始支援全文索引和全文檢索。在MySQL中,全文索引的索引型別為FULLTEXT。全文索引可以在VARCHAR或者TEXT型別的列上建立。它可以通過CREATE TABLE命令建立,也可以通過ALTER TABLE或CREATE INDEX命令建立。對於大規模的資料集,通過ALTER TABLE(或者CREATE INDEX)命令建立全文索引要比把記錄插入帶有全文索引的空表更快。本文下面的討論不再涉及全文索引,要了解更多資訊,請參見MySQL documentation。

三、單列索引與多列索引
  索引可以是單列索引,也可以是多列索引。下面我們通過具體的例子來說明這兩種索引的區別。假設有這樣一個people表:
ALTER TABLE people ADD INDEX fname_lname_age (firstname,lastname,age);
  由於索引檔案以B-樹格式儲存,MySQL能夠立即轉到合適的firstname,然後再轉到合適的lastname,最後轉到合適的age。在沒有掃描資料檔案任何一個記錄的情況下,MySQL就正確地找出了搜尋的目標記錄!
  那麼,如果在firstname、lastname、age這三個列上分別建立單列索引,效果是否和建立一個firstname、lastname、age的多列索引一樣呢?答案是否定的,兩者完全不同。當我們執行查詢的時候,MySQL只能使用一個索引。如果你有三個單列的索引,MySQL會試圖選擇一個限制最嚴格的索引。但是,即使是限制最嚴格的單列索引,它的限制能力也肯定遠遠低於firstname、lastname、age這三個列上的多列索引。


四、最左字首
  多列索引還有另外一個優點,它通過稱為最左字首(Leftmost Prefixing)的概念體現出來。繼續考慮前面的例子,現在我們有一個firstname、lastname、age列上的多列索引,我們稱這個索引為fname_lname_age。當搜尋條件是以下各種列的組合時,MySQL將使用fname_lname_age索引:
firstname,lastname,age
firstname,lastname
firstname
 從另一方面理解,它相當於我們建立了(firstname,lastname,age)、(firstname,lastname)以及(firstname)這些列組合上的索引。

五、索引的缺點
  到目前為止,我們討論的都是索引的優點。事實上,索引也是有缺點的。
  首先,索引要佔用磁碟空間。通常情況下,這個問題不是很突出。但是,如果你建立每一種可能列組合的索引,索引檔案體積的增長速度將遠遠超過資料檔案。如果你有一個很大的表,索引檔案的大小可能達到作業系統允許的最大檔案限制。
  第二,對於需要寫入資料的操作,比如DELETE、UPDATE以及INSERT操作,索引會降低它們的速度。這是因為MySQL不僅要把改動資料寫入資料檔案,而且它還要把這些改動寫入索引檔案。


  【結束語】在大型資料庫中,索引是提高速度的一個關鍵因素。不管表的結構是多麼簡單,一次50000行的表掃描操作無論如何不會快。如果你的網站上也有這種大規模的表,那麼你確實應該花些時間去分析可以採用哪些索引,並考慮是否可以改寫查詢以優化應用。

相關推薦

MySQL資料庫索引實現原理

前言:大家都知道資料庫的索引有著提升資料庫查詢速度的作用,但是很少有人對索引實現原理有深入探討,本文使用通俗語言進行解析,如有不當,歡迎指正。 原理解釋: 索引採用B樹原理,眾所周知,二叉排序樹是確定一個跟節點後,將比根節點大的資料放到右子節點,比根節點小的資料放到左子節點。而樹中的每

MySQL資料庫索引及優化

索引 什麼是索引 索引是用來提高資料庫效能的常用工具,索引就像資料的目錄一樣,通過索引可以快速找到需要的內容。 索引的原理,加快查詢 索引是建立了針對資料內容的排序結果的指標,根據指標快速定位所要的資料。 索引的設計原則 1  索引列一般為where子句中的列或連線列子句中的列。 2&

查詢資料結構及Mysql資料庫索引原理(B-/+Tree)

轉載:https://blog.csdn.net/u014800380/article/details/64441164 摘要: 本文內容主要來源於網際網路上主流文章,只是按照個人理解稍作整合,後面附有參考連結。 https://yq.aliyun.co

MySQL資料庫索引

目錄 索引是什麼 唯一索引 全文索引 索引是什麼 索引是對資料庫表中一個或多個列的值進行排序的結構,是幫助MySQL高效獲取資料的資料結構 你也可以這樣理解:索引就是加快檢索表中資料的方法。資料庫的索引類似於書籍的索引。在書籍中

MySQL 資料庫索引

資料庫的索引好比是新華字典的音序表,它是對資料庫一列或多列的值進行排序後的一種結構,其目的是提高表中資料的查詢速度。MySQL中的索引分為 索引類別 索引種類 說明 普通索引 普通索引是由KEY或者INDEX定義的索引,是基本索引型別,可以建立在任何資料中

MySQL 資料庫-索引注意事項

    索引注意事項 (1)最左字首原則 如果查詢的時候,查詢條件精確匹配索引的左邊連續一列或幾列,則可以命中索引。 (2)避免where 子句中對欄位施加函式,如to_date(create_time)>xxxxxx,

B+樹原理及mysql索引分析

B+/-Tree原理 B-Tree介紹 B-Tree是一種多路搜尋樹(並不是二叉的):       1.定義任意非葉子結點最多隻有M個兒子;且M>2;       2.根結點的兒子數為[2, M];       3.除根結點以外的非葉子結點的兒子數為[M/2, M

B+/-Tree原理及mysql索引分析

B+/-Tree原理 B-Tree介紹 B-Tree是一種多路搜尋樹(並不是二叉的):       1.定義任意非葉子結點最多隻有M個兒子;且M>2;       2.根結點的兒子數為[2, M];       3.除根結點以外的非葉子結點的兒子數為[M/2, M];

mysql資料庫——索引

索引是儲存引擎用於快速查詢記錄的一種資料結構,快速查詢的捷徑。 索引就類似一本書的目錄, 通過合理的使用資料庫索引可以大大提高系統的訪問效能。 理解索引也是資料庫效能調優的起點。   索引的分類 按照生成索引的列的數量可以分為單列索引,和 ,組合索引。 按照功能:1

MySql資料庫索引原理

寫在前面:索引對查詢的速度有著至關重要的影響,理解索引也是進行資料庫效能調優的起點。考慮如下情況,假設資料庫中一個表有10^6條記錄,DBMS的頁面大小為4K,並存儲100條記錄。如果沒有索引,查詢將對整個表進行掃描,最壞的情況下,如果所有資料頁都不在記憶體,需要讀取10^4個頁面,如果這10^4個頁面在磁

理解MySQL資料庫索引與優化

一 簡述:在資料庫操作中,正確的使用索引對應用的效能來說非常重要,當然索引也有一定的開銷,每次向表寫入時(insert、update、delete),如果建立了索引,那麼Mysql也需要更新資料庫的索引,這樣增加了對錶寫入操作的開銷。還有索引會佔用一定的空間,如果索引建立不

mysql資料庫索引原理及使用注意事項

索引原理 索引出現的原因 在使用關係型資料庫的時候,我們常常聽到一個詞:“索引”,在優化資料庫的時候,我們常常聽到有人提到新增索引可以加快資料庫的查詢速度,今天我們就來談一談它的原理。 關係型資料庫之所以叫這個名字,是因為它採用了一種名為“關係”的資料結構來儲存資料,說簡單點就是

為什麼MySQL資料庫索引選擇使用B+樹?

在進一步分析為什麼MySQL資料庫索引選擇使用B+樹之前,我相信很多小夥伴對資料結構中的樹還是有些許模糊的,因此我們由淺入深一步步探討樹的演進過程,在一步步引出B樹以及為什麼MySQL資料庫索引選擇使用B+樹! 學過資料結構的一般對最基礎的樹都有所認識,因此我

MySQL資料庫索引型別

在資料量偏大的時候執行查詢語句查詢時間會變長,這時我們會根據需求在資料庫中新增索引來加快查詢效率。我們先來做個測試,不加索引和加索引下的效率對比。 在card_code列沒加索引的時,查詢時間如下,大概都在0.07秒。  我們來加上索引試試,加上後查詢效率高了許多。

mysql資料庫原理分析

一提到關係型資料庫,我禁不住想:有些東西被忽視了。關係型資料庫無處不在,而且種類繁多,從小巧實用的 SQLite 到強大的 Teradata 。但很少有文章講解資料庫是如何工作的。你可以自己谷歌/百度一下『關係型資料庫原理』,看看結果多麼的稀少【譯者注:百度為您找到相

Mysql 資料庫索引失效

1.如果條件中有or,即使其中有條件帶索引也不會使用(這也是為什麼儘量少用or的原因) 注意:要想使用or,又想讓索引生效,只能將

Mysql資料庫索引簡介

什麼是索引?   索引是幫助高效獲取資料的資料結構,避免全表掃描   mysql為什麼用B+TREE作索引?而不是其它樹形 結構?比如B樹?   儘量少地訪問資源是資料庫設計的重要原則之一。   B樹不管葉子節點還是非葉子節點,都會儲存資料,這樣導致在非葉子節 點中能儲存的指標數量變少(有些資料

MySQL(二):快速理解MySQL資料庫索引

# 索引 基本概念:索引是在儲存引擎層實現的,而不是在伺服器層實現的,所以不同儲存引擎具有不同的索引型別和實現。 ## 資料結構 + Tree 指的是 Balance Tree,也就是平衡樹。平衡樹是一顆查詢樹,並且所有葉子節點位於同一層。 + B+ Tree 是基於 B Tree 和葉子節點順序訪問指標進行

重新學習Mysql資料庫5:根據MySQL索引原理進行分析與優化

本文出自我的公眾號:程式設計師江湖。 滿滿乾貨,關注就送。 一:Mysql原理與慢查詢 MySQL憑藉著出色的效能、低廉的成本、豐富的資源,已經成為絕大多數網際網路公司的首選關係型資料庫。雖然效能出色,但所謂“好馬配好鞍”,如何能夠更好的使用它,已經成為開發工程

Mysql資料庫索引分析

一、什麼是索引?   索引用來快速地尋找那些具有特定值的記錄,所有MySQL索引都以B-樹的形式儲存。如果沒有索引,執行查詢時MySQL必須從第一個記錄開始掃描整個表的所有記錄,直至找到符合要求的記錄。表裡面的記錄數量越多,這個操作的代價就越高。如果作為搜尋條件的列上已經建立