引起索引失效的情況
什麼是索引
索引是儲存引擎快速找到記錄的一種資料結構。在mysql中也稱為key鍵。
為什麼需要索引(優點)
索引能加快檢索速度,提高查詢效能。
1.大大減少伺服器掃瞄的資料行數
2.避免伺服器進行排序和分組,也因此避免了建立臨時表
3.將隨機i/o變成順序i/o(下面會提到b+樹的儲存物理順序和邏輯順序一致)
索引的實現
目前來說大部分索引的都是由b+樹實現的。b+樹索引是一種按欄位排序的樹形資料結構。
innodb的b+樹索引分為主索引和輔助索引。主索引的葉子節點data域記錄著完整的資料記錄,根節點和分支結點記錄著索引。輔助索引的葉子節點記錄著資料的主鍵值,使用輔助索引進行查詢時,需要先查找到主鍵值,然後再到主索引中進行查詢。
(在mysql資料庫的innodb儲存引擎中,主鍵索引就是聚簇索引,所有資料都會按照主鍵索引進行組織;而在myisam儲存引擎中,就沒有聚簇索引了,因為myisam儲存引擎中的資料不是按索引順序進行儲存的)
1.聚簇索引
聚簇索引規定了表中資料的物理存放順序,資料行的物理順序與列值(一般是主鍵的那一列)的邏輯順序相同,乙個表中只能擁有乙個聚簇索引,可以模擬於字典中的按拼音目錄。
它的優勢在於:查詢小資料量的表;查詢指定範圍內的資料。但聚簇索引不適用於頻繁刪改的資料,這導致整行移動,影響效能,個人認為類似於陣列的刪除和插入帶來的問題。
由於聚簇索引實質上同時包括了完整資料和索引,而資料不可能存在兩個地方,因此乙個表的聚簇索引只有乙個。
簡單理解聚簇索引,可以認為檢視已知字的解釋時,翻看新華字典就是聚簇索引,因為它本身內容就是按順序的。比如說我們查詢乙個「李」字,我們直接會直接翻到拼音li,相當於索引和內容是在一起的。內容本身就是目錄,不需要檢視其他目錄就能直接找到資料的方式就是聚簇索引。
2.非聚簇索引
當我們不認識乙個字,需要根據部首去翻閱目錄,根據目錄找到內容的方式可以認為是非聚簇索引。目錄純粹目錄,正文純粹正文的方式我們認為是非聚簇索引。
mysql索引分類和比較
b+樹索引
是大多數mysql預設的索引型別。
優點:不需要對資料進行全面掃瞄,只需要對數搜尋就好了,查詢速度快一點。除了查詢外,b+樹索引還可以對資料進行排序和分組。
適用情況:全鍵值,鍵值範圍和鍵字首查詢。
雜湊索引
雜湊索引能以o(1)時間進行查詢,畢竟雜湊碼可以直接找到資料,但是失去了有序性。
優缺點:查詢速度更快,但較b+樹來說,雜湊索引不能完成分組和排序。
適用情況:精確查詢。
全文索引
空間資料索引
myisam 儲存引擎支援空間資料索引(r-tree),可以用於地理資料儲存。
引起索引失效的情況
(1)以「%」開頭的like語句,模糊匹配
(2)or語句前後沒有同時使用索引
(3)資料型別出現隱式轉化(如varchar不加單引號的話可能會自動轉換為int型)
(4)帶非操作符,如<>/!=/not in/not exist
(5)列上作運算
最後總結一下,mysql只對以下操作符才使用索引:<,<=,=,>,>=,between,in,以及某些時候的like(不以萬用字元%或_開頭的情形),而對於<>,not in是不會使用索引的。
MySQL 索引與索引原理
本人菜鳥一枚,如有理解不對,請大神多多指正!一 索引 1 什麼是索引?答 索引類似於一本書的目錄,便於資料快速高效的查詢,也可以解釋為資料按照某個特定的規則去儲存排序資料 2 索引的型別?答 索引可以分為 普通索引,唯一索引,主鍵索引和組合索引 2.1 普通索引 最基本的一種索引方式,沒有什麼限制 ...
MySQL使用索引與不使用索引比較
首先,我們通過下面的方式生成1百萬條資料。在不建立索引情況下,通過下面的語句查詢age 20的人數 select count 1 from t user where age 20 耗時 1.2s 通過下面的語句檢視執行計畫 explain select count 1 from t user whe...
唯一索引與主鍵索引的比較
唯一索引 唯一索引不允許兩行具有相同的索引值。如果現有資料中存在重複的鍵值,則大多數資料庫都不允許將新建立的唯一索引與表一起儲存。當新資料將使表中的鍵值重複時,資料庫也拒絕接受此資料。例如,如果在 employee 表中的職員姓氏 lname 列上建立了唯一索引,則所有職員不能同姓。主鍵索引 主鍵索...