#建立乙個名為user的表,其包括id,name,age,***等字段資訊。此外,id為主鍵聚簇索引,idx_name為非聚簇索引。
create table `user` (`
id`varchar(10) not null default '',
`name`
varchar(10) default null,
`age`
int(11) default null,
`***`
varchar(10) default null,
primary key (`id
`),key `idx_name`
(`name`
) using btree
) engine=innodb default charset=utf8;
#我們將其設定10條資料,便於下面的索引的理解。
insert into `user`
values (
'1', 'andy', '20', '女');
insert into `user`
values (
'10', 'baby', '12', '女');
insert into `user`
values (
'2', 'kat', '12', '女');
insert into `user`
values (
'3', 'lili', '20', '男');
insert into `user`
values (
'4', 'lucy', '22', '女');
insert into `user`
values (
'5', 'bill', '20', '男');
insert into `user`
values (
'6', 'zoe', '20', '男');
insert into `user`
values (
'7', 'hay', '20', '女');
insert into `user`
values (
'8', 'tony', '20', '男');
insert into `user`
values (
'9', 'rose', '21', '男'
他包含兩個特點:
1.使用記錄主鍵值的大小來進行記錄和頁的排序。
頁內的記錄是按照主鍵的大小順序排成乙個單項鍊表。
各個存放使用者記錄的頁也是根據頁中使用者記錄的主鍵大小順序排成乙個雙向鍊錶。
2.葉子節點儲存的是完整的使用者記錄。
注:聚簇索引不需要我們顯示的建立,他是由innodb儲存引擎自動為我們建立的。如果沒有主鍵,其也會預設建立乙個。
上面的聚簇索引只能在搜尋條件是主鍵時才能發揮作用,因為聚簇索引可以根據主鍵進行排序的。如果搜尋條件是name,在剛才的聚簇索引上,我們可能遍歷,挨個找到符合條件的記錄,但是,這樣真的是太蠢了,mysql不會這樣做的。
如果我們想讓搜尋條件是name的時候,也能使用索引,那可以多建立乙個基於name的二叉樹。如下圖。
他與聚簇索引的不同:
1.葉子節點內部使用name欄位排序,葉子節點之間也是使用name欄位排序。
2.葉子節點不再是完整的資料記錄,而是name和主鍵值。
為什麼不再是完整資訊?
mysql只讓聚簇索引的葉子節點存放完整的記錄資訊,因為如果有好幾個非聚簇索引,他們的葉子節點也存放完整的記錄績效,那就不浪費空間啦。
如果我搜尋條件是基於name,需要查詢所有欄位的資訊,那查詢過程是啥?
1.根據查詢條件,採用name的非聚簇索引,先定位到該非聚簇索引某些記錄行。
2.根據記錄行找到相應的id,再根據id到聚簇索引中找到相關記錄。這個過程叫做回表。
如果name和age組成乙個聯合索引,那麼先按name排序,如果name一樣,就按age排序。
1.最左字首原則。乙個聯合索引(a,b,c),如果有乙個查詢條件有a,有b,那麼他則走索引,如果有乙個查詢條件沒有a,那麼他則不走索引。
2.使用唯一索引。具有多個重複值的列,其索引效果最差。例如,存放姓名的列具有不同值,很容易區分每行。而用來記錄性別的列,只含有「男」,「女」,不管搜尋哪個值,都會得出大約一半的行,這樣的索引對效能的提公升不夠高。
3.不要過度索引。每個額外的索引都要占用額外的磁碟空間,並降低寫操作的效能。在修改表的內容時,索引必須進行更新,有時可能需要重構,因此,索引越多,所花的時間越長。
4、索引列不能參與計算,保持列「乾淨」,比如from_unixtime(create_time) = 』2014-05-29』就不能使用到索引,原因很簡單,b+樹中存的都是資料表中的字段值,但進行檢索時,需要把所有元素都應用函式才能比較,顯然成本太大。所以語句應該寫成create_time = unix_timestamp(』2014-05-29』);
5.一定要設定乙個主鍵。前面聚簇索引說到如果不指定主鍵,innodb會自動為其指定主鍵,這個我們是看不見的。反正都要生成乙個主鍵的,還不如我們設定,以後在某些搜尋條件時還能用到主鍵的聚簇索引。
6.主鍵推薦用自增id,而不是uuid。上面的聚簇索引說到每頁資料都是排序的,並且頁之間也是排序的,如果是uuid,那麼其肯定是隨機的,其可能從中間插入,導致頁的**,產生很多表碎片。如果是自增的,那麼其有從小到大自增的,有順序,那麼在插入的時候就新增到當前索引的後續位置。當一頁寫滿,就會自動開闢乙個新的頁。
注:如果自增id用完了,那將字段型別改為bigint,就算每秒1萬條資料,跑100年,也沒達到bigint的最大值。
1、 b+樹的磁碟讀寫代價更低:b+樹的內部節點並沒有指向關鍵字具體資訊的指標,因此其內部節點相對b樹更小,如果把所有同一內部節點的關鍵字存放在同一盤塊中,那麼盤塊所能容納的關鍵字數量也越多,一次性讀入記憶體的需要查詢的關鍵字也就越多,相對io讀寫次數就降低了。
2、由於b+樹的資料都儲存在葉子結點中,分支結點均為索引,方便掃庫,只需要掃一遍葉子結點即可,但是b樹因為其分支結點同樣儲存著資料,我們要找到具體的資料,需要進行一次中序遍歷按序來掃,所以b+樹更加適合在區間查詢的情況,所以通常b+樹用於資料庫索引。
超易懂 指標
指標,一直都是c語言中的難點,剛開始大一剛學c的時候就感覺懵逼,一直都是簡簡單單去理解,簡簡單單的使用,從沒有說去深刻研究一下,尤其是現在決定搞 開發了,以後估計更少用到,所以趁現在有點時間趕緊好好看一看。好好的搞懂它。一 什麼是指標?這裡就有個很多人容易搞混的概念,什麼是指標,什麼是指標變數,不懂...
通俗易懂SQL server 中的索引
一 什麼是索引?資料庫索引其實就是類似目錄的乙個東西,搜尋的時候能夠引導你更好更快的查出來。主要目的是提高了sql server系統的效能,加快資料的查詢速度與減少系統的響應時間 二 為什麼要用索引?好的索引會讓資料查詢效率提高百倍,所以必要的情況下需要使用索引來提高速度。三 怎麼使用索引?1 索引...
超簡單易懂的編譯原理詞法分析 python
詞法分析是電腦科學中將字串行轉換為單詞序列的過程,進行詞法分析的程式或者函式叫作詞法分析器,也叫掃瞄器。在本程式中,我通過python實現了乙個簡單的詞法分析器,該程式並不包含完整的詞法分析,因為給的例子並不是很難,所以就沒有新增很多,但是道理就是這樣的道理。example b 1 00101 a ...