索引覆蓋** 很重要的 一個概念 就是在索引上查找! ! !
如果查詢的列恰好是索引的一部分,那麼查詢只需要在索引文件上進行,不需要回行到磁碟再找資料.
這種查詢速度非常快,稱為」索引覆蓋」
非聚促索引索引檔案對應了資料要回行浪費掉了時間
索引和資料差異
索引是高效組織起來的樹, 節點,查找樹葉結構較優於資料
索引可以匯入記憶體中進行查詢
索引本身資料結構簡單再放入記憶體很快很快
。 。 。 。 。 。 。 。 。結果一回行 就滿了。 。 。我擦。 。 。
所以呢如果建立兩個索引index( uid , aid)
如果在索引樹上已經覆蓋了你想要的數據如select uid from msg where aid = 1
索引已經覆蓋了想要查的則直接在記憶體中的索引取出來速度效率都非常快自然不用回行查找
最優索引:
查詢頻繁,區分度高,長度小
盡量覆蓋常用字段, ------》索引覆蓋
左前綴不易區分逆轉url 把內容到過來;左前綴區分度大
偽哈希crc32() 函數來唯一區分crc32('http://wwww.baidu.com');給urlcrc 建索引而不是去給url 避免了索引
學會explain 來查看效果;
偽hash索引效果
同時存url_hash列
create table t10 ( id int primary key, url char(60) not null default '' );
insert into t10 values (1,'http://www.baidu.com'), (2,'http://www.sina.com'), (3,'http://www.sohu.com.cn'), (4,'http://www.onlinedown.net'), (5,'http://www.gov.cn'); alter table t10 add urlcrc int unsigned not null;
在sqlc上儲存時, crcurl== crccurl
在sqlc的結果是32位元int無符號數,因此當資料超過40億,也會有重複,但這是值得的.
(索引長度為int4個字節)
多咧索引的設計
但從商城的實際業務業務看, 顧客一般先選大分類->小分類->品牌,
最終選擇(1)index(cat_id,brand_id), + index(cat_id,shop_price)來建立索引
甚至可以再加(3)index(cat_id,brand_id,shop_price),3個冗餘索引冗餘欄位。 。 。
但(3)中的前2列和(1)中的前2列一樣,再去掉(1)
index(cat_id,price) 和index(cat_id,brand_id,shop_price);就是可以冗餘但是不能重複左前綴原則