1. 程式人生 > >Mysql設定索引的注意事項

Mysql設定索引的注意事項

在講索引設定前先說說索引的原理。索引(Index)是幫助MySQL高效獲取資料的資料結構。提取句子主幹,就可以得到索引的本質:索引是一種資料結構

一般來說,索引本身也很大,不可能全部儲存在記憶體中,因此索引往往以索引檔案的形式儲存的磁碟上。這樣的話,索引查詢過程中就要產生磁碟I/O消耗,相對於記憶體存取,I/O存取的消耗要高几個數量級,所以評價一個數據結構作為索引的優劣最重要的指標就是在查詢過程中磁碟I/O操作次數的漸進複雜度。換句話說,索引的結構組織要儘量減少查詢過程中磁碟I/O的存取次數。

MyisAM儲存引擎的索引檔案和資料檔案是分開的,在通過索引查詢得到的是資料記錄在磁碟的實體地址,然後再根據這個地址去查詢關聯的資料資訊。MyisAM不支援外來鍵,不支援行級鎖,不支援事務,所以不經常使用。

這裡寫圖片描述

InnoDB儲存引擎的索引和資料是存放在同一個檔案內的,而且資料是按照主鍵的順序排列的,所以主鍵索引也叫聚集索引或聚簇索引。普通欄位上的索引是非聚集索引。主鍵索引上的value是當前記錄資訊(不包含主鍵),非聚集索引上的value儲存的是主鍵。當查詢時使用的是主鍵索引,那麼能直接返回需要的資料;如果查詢時使用的是非聚集索引,第一步返回主鍵,第二步通過這個主鍵去查詢相應的記錄,額外多了一步。

這裡寫圖片描述

這裡寫圖片描述

相比於MyisAM儲存,InnoDB引擎的索引結構有些不同,且分為聚集索引和非聚集索引,MyisAM沒有這個之分,主鍵和非主鍵索引存的都是資料記錄的磁碟地址。

1.使用自增主鍵
因為InnoDB引擎的資料是按照主鍵的順序排列的,所以如果主鍵是非自增的,那麼當插入一條新的資料時,比如原先有主鍵為48,50的資料,他們是緊密排列的,當插入一條主鍵為49的資料,那麼就需要將50的資料往下挪一位,然後將49的資料插入;如果當前資料頁的容量已經滿了,一般Mysql內的資料頁大小是預設16K,如果每條資料記錄的大小是500B,那麼最多也只能存不到30條,因為資料頁還需要儲存其他型別的資料資訊,比如上下頁的引用地址,頁型別等。當一頁已經滿了時,就需要分裂此頁,那麼久會導致一頁左右的資料分散到兩頁中,兩頁上會有很多額外的空閒空間,也就是多了很多的磁碟碎片空間,導致資源的浪費。主鍵非自增,插入資料時需要額外的移動資料行以及可能導致更多的碎片空間。

所以推薦使用不具有業務含義的自增欄位來作為表的主鍵。

2.改變頻率太高的欄位不適合加索引
索引是一種資料結構,頻繁的改變索引欄位的值,就會不斷的改變當前記錄對應的索引行在索引頁的位置,類似主鍵非自增一樣,會增加額外的磁碟IO消耗和額外的磁碟碎片。

3.分佈集中的欄位不適合加索引
索引是按照字元的字典順序排列的,如果加索引的欄位重複性很高,那麼通過索引頁只能搜尋到欄位相同的區間,假設性別欄位只有’男’和’女’兩個選擇,加了索引,也只能查詢到欄位值為’男’或’女’區間,效率很低下。雖然說相比原來也提高了50%的效能,但是索引也是需要佔據磁碟空間的,而且一張表很多時候含有不止一個索引,導致索引佔據的磁碟空不見得比實際資料小,為了空間和效能的平衡,不建議對值分佈集中的欄位新增索引。

4.字首索引
如果一個欄位值的字元長度很長,而整個欄位又是查詢的常用欄位,此時完全使用整個欄位的值做索引是不合適的,因為這會導致索引結構變得很大,額外佔據更多的磁碟空間,此時需要嘗試新增字首索引,也就是將這個欄位的前多少個字元作為索引的key,在查詢匹配時會將擷取當前欄位的前多少個字元和索引的key匹配。
至於選擇多少的長度為好,可以計算下:

select count( distinct ( left (column,length ) ) ) / count(column) from ....;

計算索引選擇率,即欄位字首不同的記錄行數除以記錄總數,當有0.9以上時,可以視作是合適的字首長度。

5.複合索引的最左字首原則
Mysql查詢時,針對每張表只會使用當前表的一個索引,如果查詢時很多時候會有幾個欄位作為查詢條件,那麼針對每個欄位都建立一個索引是不合適的。此時可以嘗試建立複合索引,也就是索引裡包含了多個欄位的值,複合索引的建立需要遵循最左字首原則。所謂的最左字首指的是索引欄位從左到右按照出現頻率由高到低排列,查詢時出現頻率最高的欄位方最左側,最低的放最右側。對多個欄位新增複合索引時,並非對每個欄位都新增一個索引,而是對第一個欄位值作為索引,以第一個欄位值加上第二個欄位值作為第二個索引,之後是第一,第二,第三個欄位值合併做索引,假設複合字段為Index(A,B,C),則建立三個索引,A,A+B,A+B+C。複合索引對於多個欄位查詢的場景很適用,因為A+B+C這種索引形式使的key更加難以相同,也就是說多個索引欄位查詢時能夠得到更小的結果範圍。

相關推薦

MySQL 資料庫-索引注意事項

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

mysql複合索引注意事項

概念:     單一索引是指索引列為一列的情況,即新建索引的語句只實施在一列上;     使用者可以在多個列上建立索引,這種索引叫做複合索引(組合索引);     複合索引在資料庫操作期間所需的開銷更

Mysql設定索引注意事項

在講索引設定前先說說索引的原理。索引(Index)是幫助MySQL高效獲取資料的資料結構。提取句子主幹,就可以得到索引的本質:索引是一種資料結構。 一般來說,索引本身也很大,不可能全部儲存在記憶體中,因此索引往往以索引檔案的形式儲存的磁碟上。這樣的話,索引查詢

MySQL索引注意事項

索引使用注意: JOIN 索引,所有匹配ON和where的欄位應建立合適的索引。 唯一值越多的欄位,使用索引的效果越好。設定聯合索引時,唯一值越多的,越應該放在“左側”。 如果可以在多個索引中進行選擇,MySQL通常使用找到最少行的索引,索引唯一值最高的索引。 建

mysql資料型別/注意事項/int(20)混淆

int(20), bigint(20)括號裡的內容指的是顯示時填充0的個數,而不是位元組或空間限制,不同於char(20)或varchar(20)的意義: https://stackoverflow.com/questions/3135804/types-in-mysql-bigint20-vs-int20

sql語句(Oracle和mysql)的注意事項

我們在平時寫sql語句的時候很容易忽視一些細節問題,而且在Oracle和mysql中sql語句也是有很多的不同之處,這些我們都需要注意,下面我就把平時比較容易忽視的幾個點列出來。 一:分頁 mysql 分頁:select * form 表名 limit m,n; Oracel中分頁:

Mysql/Mariadb 升級注意事項

因需要使用到分割槽表,在業務不中斷的情況下,可以新增分割槽,需要將原來的Mariadb10.1.25版本升級到Mariadb10.3.8。 1、升級步驟如下 1)新搭建Mariadb10.3.8版本的DB 2)全備份Mariadb10.1.25版本資料(表結構、儲存過程、函式、觸發器等) 3)將Mar

Mysql GROUP_CONCAT 使用注意事項

GROUP_CONCAT 函式返回一個字串結果,該結果由分組中的值連線組合而成,常和 GROUP BY 連用。如果需要自定義分隔符可以使用 SEPARATOR。示例:SELECT GROUP_CONCAT(id) ids FROM sys_oem_resources WHER

ActiveMQ5.14.3持久化資訊到MySQL的一些注意事項

最近都在基於ActiveMQ實現安卓端的推送,遇到了一些問題,都記錄一下。 ActiveMQ預設情況下使用KahaDB儲存資料,網上也有很多持久化訊息到MySQL的方法,基本差不多,如這篇所示: Activemq持久化訊息到MySql資料庫中 可能以前ActiveMQ的版

mysql insert語法注意事項(ON DUPLICATE KEY UPDATE )

NSERT [LOW_PRIORITY | DELAYED | HIGH_PRIORITY] [IGNORE]        [INTO] tbl_name [(col_name,...)]        VALUES ({expr | DEFAULT},...),(...),...        [ ON

Mysql replace into注意事項

什麼時候使用replace into 在向表中插入資料的時候,經常遇到這樣的情況:1. 首先判斷資料是否存在; 2. 如果不存在,則插入;3.如果存在,則更新。在 SQL Server 中可以這樣處理: if not exists (select 1 from t whe

mysql索引、主鍵、唯一索引、聯合索引的區別(索引的建立原則和注意事項

索引對資料庫效能的影響? 本質:縮小查詢範圍。大大減少需要掃描的資料量。大大提高查詢的速度,降低寫的速度,佔用磁碟。將隨機I/O變成順序I/O 特大的表怎麼解決查詢問題? 分割槽。 主鍵索引和唯一索引的區別? 一個表只能有一個主鍵索引,但可以有多個唯一索引, 主鍵索引是唯一索

MySQL索引的使用及注意事項

索引是儲存引擎用於快速找到記錄的一種資料結構。索引優化應該是對查詢效能優化最有效的手段了。索引能夠輕易將查詢效能提高几個數量級,"最優"的索引有時比一個"好的"索引效能要好兩個數量級。 索引可以包含一個(單列索引)或多個列(組合索引)的值。 想要使用組合索引首先要了解一個原則:最左字首原則。如果索引包含多

Mysql索引命令、優缺點、注意事項

建立表時簡歷索引 1、建表同時建立單索引 CREATE TABLE t_user1(id INT , userName VARCHAR(20), PASSWORD VARCHAR(20), INDEX (userName) #關鍵字INDEX ); 2、建表同時建立唯一索引(可以是單或多

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

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

mysql 索引使用注意事項

原文地址 點選文章目錄MySQL 索引通常是被用於提高 WHERE 條件的資料行匹配時的搜尋速度,在索引的使用過程中,存在一些使用細節和注意事項。不要在列上使用函式和進行運算不要在列上使用函式,這將導致索引失效而進行全表掃描。select*from news where ye

MySQL索引缺點&使用詳細注意事項

雖然索引大大提高了查詢速度,同時卻會降低更新表的速度,如對錶進行INSERT、UPDATE和DELETE。因為更新表時,MySQL不僅要儲存資料,還要儲存一下索引檔案。  建立索引會佔用磁碟空間的索引檔案。一般情況這個問題不太嚴重,但如果你在一個大表上建立了多種組合索引,索引檔案的會膨脹很快。  索引只是提

【面試寶典 - 核心篇 - 資料儲存】02 MySQL 索引使用的注意事項

索引不會包含 NULL 的列 只要列中包含有 NULL 的值,都將不會被包含在索引中,複合索引中只要有一列含有 NULL 值,那麼這一列對於此符合索引就是無效的。 使用短索引 對串列進行索引,如果可以就應該指定一個字首長度。例如,如果有一個 char(255) 的列,如果

MySQL索引型別總結和使用技巧以及注意事項

在資料庫表中,對欄位建立索引可以大大提高查詢速度。假如我們建立了一個 mytable表: 複製程式碼程式碼如下: CREATE TABLE mytable(   ID INT NOT NULL,    username VARCHAR(16) NOT NULL  ); 我們隨機向裡面插入了100

mysql中timestamp欄位型別設定default/expression的注意事項

DEFAULT CURRENT_TIMESTAMP 插入新元組時自動將該值設為系統當前時間, 但以後對該元組update時不再更新該欄位 但特地set該時間欄位為指定值時, 欄位值自然就會改變.