mysql引索某一行 mysql索引

2021-10-18 02:14:36 字數 3875 閱讀 2569

mysql的索引

索引用於快速找出在某個列中有一特定值的行,不使用索引,mysql必須從第一條記錄開始讀完整個表,直到找出相關的行,表越大,查詢資料所花費的時間就越多,如果表中查詢的列有乙個索引,mysql能夠快速到達乙個位置去搜尋資料檔案,而不必檢視所有資料,那麼將會節省很大一部分時間。

myisam儲存引擎,資料檔案、索引檔案、表結構檔案分開儲存

innodb儲存引擎,資料和索引儲存在乙個檔案中

這是因為索引使用的資料結構,一般為b+tree,目前大部分資料庫系統及檔案系統都採用b-tree或其變種b+tree作為索引結構。

b-tree介紹

為了描述b-tree,首先定義一條資料記錄為乙個二元組[key, data],key為記錄的鍵值,對於不同資料記錄,key是互不相同的;data為資料記錄除key外的資料。那麼b-tree是滿足下列條件的資料結構:

d為大於1的乙個正整數,稱為b-tree的度。

h為乙個正整數,稱為b-tree的高度。

每個非葉子節點由n-1個key和n個指標組成,其中d<=n<=2d。

每個葉子節點最少包含乙個key和兩個指標,最多包含2d-1個key和2d個指標,葉節點的指標均為null 。

所有葉節點具有相同的深度,等於樹高h。

key和指標互相間隔,節點兩端是指標。

乙個節點中的key從左到右非遞減排列。

所有節點組成樹結構。

每個指標要麼為null,要麼指向另外乙個節點。

如果某個指標在節點node最左邊且不為null,則其指向節點的所有key小於v(key_1),其中v(key_1)為node的第乙個key的值。

如果某個指標在節點node最右邊且不為null,則其指向節點的所有key大於v(key_m),其中v(key_m)為node的最後乙個key的值。

如果某個指標在節點node的左右相鄰key分別是key_i和key_且不為null,則其指向節點的所有key小於v(key_)且大於v(key_i)。

b+tree

b-tree有許多變種,其中最常見的是b+tree,例如mysql就普遍使用b+tree實現其索引結構。

與b-tree相比,b+tree有以下不同點:

每個節點的指標上限為2d而不是2d+1。

內節點不儲存data,只儲存key;葉子節點不儲存指標。

mysql目前主要有以下幾種索引型別:fulltext,hash,btree,rtree。

fulltext

起初全文索引myisam存在,而innodb在mysql5.6引入了全文索引

全文索引,按照我現在的理解,主要是為了處理mysql的like語句,因為使用like語句存在三種情況

1. like %word%

2. like %word

3. like word%

1和2,不可以通過其他型別的索引進行查詢,即萬用字元在like語句後的引數中的開始,這個時候使用mysql查詢語句,如果索引格式不是全文索引,是不可以通過索引查詢的,會進行全表掃瞄。

而3可以使用其他索引

hash

hash索引只能做等於查詢,但是無論多大的hash表,查詢複雜度都是o(1)

(1)hash 索引僅僅能滿足"=","in"和"<=>"查詢,不能使用範圍查詢。

由於 hash 索引比較的是進行 hash 運算之後的 hash 值,所以它只能用於等值的過濾,不能用於基於範圍的過濾,因為經過相應的 hash 演算法處理之後的 hash 值的大小關係,並不能保證和hash運算前完全一樣。

(2)hash 索引無法被用來避免資料的排序操作。

由於 hash 索引中存放的是經過 hash 計算之後的 hash 值,而且hash值的大小關係並不一定和 hash 運算前的鍵值完全一樣,所以資料庫無法利用索引的資料來避免任何排序運算;

(3)hash 索引不能利用部分索引鍵查詢。

對於組合索引,hash 索引在計算 hash 值的時候是組合索引鍵合併後再一起計算 hash 值,而不是單獨計算 hash 值,所以通過組合索引的前面乙個或幾個索引鍵進行查詢的時候,hash 索引也無法被利用。

(4)hash 索引在任何時候都不能避免表掃瞄。

前面已經知道,hash 索引是將索引鍵通過 hash 運算之後,將 hash運算結果的 hash 值和所對應的行指標資訊存放於乙個 hash 表中,由於不同索引鍵存在相同 hash 值,所以即使取滿足某個 hash 鍵值的資料的記錄條數,也無法從 hash 索引中直接完成查詢,還是要通過訪問表中的實際資料進行相應的比較,並得到相應的結果。

(5)hash 索引遇到大量hash值相等的情況後效能並不一定就會比b-tree索引高。

對於選擇性比較低的索引鍵,如果建立 hash 索引,那麼將會存在大量記錄指標資訊存於同乙個 hash 值相關聯。這樣要定位某一條記錄時就會非常麻煩,會浪費多次表資料的訪問,而造成整體效能低下。

btree

mysql預設的索引型別

rtree

這個型別的索引很少在mysql中使用

索引格式

預設mysql乙個表16個索引。通過配置可以進行修改。

索引種類

普通索引:僅加速查詢

唯一索引:加速查詢 + 列值唯一(可以有null)

主鍵索引:加速查詢 + 列值唯一(不可以有null)+ 表中只有乙個

組合索引:多列值組成乙個索引,專門用於組合搜尋,其效率大於索引合併

全文索引:對文字的內容進行分詞,進行搜尋

建立索引有優點,也有缺點,這是任何事情必然具有的兩面性。

優點:1 大大減少查詢時間

缺點:1 建立索引,刪除索引需要資料庫相應。並且資料表資料行數越多,花費時間越長

2 索引同樣是需要空間的

索引的使用

索引的建立格式

create [unique|fulltext|spatial] index 索引名 on 表名(欄位名[(長度)] [asc|desc]);

引數說明

unique、fulltext和spatial都是可選引數,分別用於表示唯一性索引、全文索引和空間索引。

使用注意

索引分為單列索引和聯合索引。

1 單列索引,在查詢語句的使用中,僅適合於單列where

2 聯合索引,適合多個where條件

例如,建立的user表中具有name,***,age欄位,索引為user(name,age,***),排序為asc,*** 1男2女

以下是使用索引的查詢

select * from user where name = 'user'

select * from user where name = 'user' and age = 18

select * from user where name = 'user' and age = 18 and *** = 1

不使用索引的查詢

1.最佳左字首原則

組合索引,不按索引定義時制定的順序 的最左列開始

2.like 『%z』

like模糊查詢時, 以%開頭,導致索引失效

3.範圍之後全失效(>

如果是主鍵或者索引列是整數,索引不會失效

4.遇到null值,索引失效

5.索引列上的顯式或者隱式運算,導致索引失效

6.order by

由於查詢只使用乙個索引,因此,如果where語句使用了索引,order by語句不會使用

7.不在乙個方向的order by導致索引失效

查詢使用索引必須 全asc 或 全desc

8.組合索引,中間跳過了某一列,後面的列全失效

9.is null is not null != <> 都會導致索引失效,如果這些用在主鍵列上,仍會使用索引

10.字串型別不加單引號,導致索引失效

不加單引號,會有隱式的型別轉化(索引列上的計算會導致索引失效)

11.用or連線導致索引失效

or條件有未建立索引的列導致索引失效

mysql引索某一行 MySQL之索引

索引 什麼是索引 可以理解為 搜尋引導,索引是乙個特殊的資料結構,其儲存的是資料的關鍵資訊與詳細資訊的位置對應關係 例如 書本的目錄 為什麼需要索引 加速查詢,當資料量非常大的時候,查詢某乙個資料是非常慢 索引的影響 1.不是說有了索引就能加速,得看你的查詢語句有沒有正確使用索引 2.索引也需要占用...

mysql 上一行減去下一行

1.新建表1新增自增行號列 考慮到自增id 有丟失資料現象 2.複製上表1為表2 3.根據表1 表2行號進行where或者left join on的處理 where 進行處理的條件為表1表2完全的匹配 left join on 處理的條件為 左表完全的匹配 設定記憶體變數 set arownum 0...

更改檔案,某一行

1 deffetch data 2print 這是查詢功能 3 tag false 4 data aaaa s n data 5 res data 6 with open bbb r encoding gbk as file 7for i in file 8if i data 9 tag true ...