索引覆蓋** 很重要的 一個概念 就是在索引上查找!!!
如果查詢的列恰好是索引的一部分,那么查詢只需要在索引文件上進行,不需要回行到磁盤再找數據.
這種查詢速度非常快,稱為”索引覆蓋”
非聚促索引 索引文件對應了數據要回行 浪費掉了時間?
索引和數據區別?
索引是高效組織起來的樹 , 節點 ,查找樹葉 結構更優于數據
索引可以被導入內存中進行查詢?
索引本身數據結構簡單 再放入內存 很快很快?
。。。。。。。。。結果一回行 就滿了。。。我擦。。。
所以呢 如果建立兩條索引 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;
在sql存儲時, crcurl== crc32(url),
因為crc的結果是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); 也就是可以冗余 但是不能能重復 左前綴原則
?以上就是mysql 優化(4)索引覆蓋和最優索引的內容,更多相關內容請關注PHP中文網(www.php.cn)!