設(shè)計表之初最好就把索引建立完成喷户,根據(jù)where后面的條件唾那,簡單把索引建立起來
這樣表還原到生產(chǎn)庫的時候,索引隨著建表語句就建立完成了摩骨,要不然就會陷入一個表一個表create index的困境通贞,手動創(chuàng)建索引很痛苦。
手動創(chuàng)建索引的sql語句~
CREATE INDEX ORDER_ID_INDEX ON saf_house_order_pay_info (order_id);
CREATE INDEX AMOUNT_INDEX ON saf_house_order_pay_info (amount);
查看索引show index from table_name;即可
附 btree索引與hash索引的解析【主流btree索引】
Hash索引
所謂Hash索引恼五,當我們要給某張表某列增加索引時昌罩,將這張表的這一列進行哈希算法計算,得到哈希值灾馒,排序在哈希數(shù)組上茎用。所以Hash索引可以一次定位,其效率很高,而Btree索引需要經(jīng)過多次的磁盤IO轨功,但是innodb和myisam之所以沒有采用它旭斥,是因為它存在著好多缺點:
1、因為Hash索引比較的是經(jīng)過Hash計算的值古涧,所以只能進行等式比較垂券,不能用于范圍查詢
1、每次都要全表掃描
2羡滑、由于哈希值是按照順序排列的菇爪,但是哈希值映射的真正數(shù)據(jù)在哈希表中就不一定按照順序排列,所以無法利用Hash索引來加速任何排序操作
3柒昏、不能用部分索引鍵來搜索凳宙,因為組合索引在計算哈希值的時候是一起計算的。
4职祷、當哈希值大量重復(fù)且數(shù)據(jù)量非常大時氏涩,其檢索效率并沒有Btree索引高的。
至于Btree索引有梆,它是以B+樹為存儲結(jié)構(gòu)實現(xiàn)的是尖。
但是Btree索引的存儲結(jié)構(gòu)在Innodb和MyISAM中有很大區(qū)別。
在MyISAM中淳梦,我們?nèi)绻獙δ硰埍淼哪沉薪tree索引的話析砸,如圖:
所以我們經(jīng)常會說MyISAM中數(shù)據(jù)文件和索引文件是分開的。
因此MyISAM的索引方式也稱為非聚集爆袍,Innodb的索引方式成為聚集索引首繁。
至于輔助索引,類似于主索引陨囊,唯一區(qū)別就是主索引上的值不能重復(fù)弦疮,而輔助索引可以重復(fù)。
因此當我們根據(jù)Btree索引去搜索的時候蜘醋,若key存在胁塞,在data域找到其地址,然后根據(jù)地址去表中查找數(shù)據(jù)記錄压语。
至于Innodb它跟上面又有很大不同啸罢,它的葉子節(jié)點存儲的并不是表的地址,而是數(shù)據(jù)
我們可以看到這里并沒有將地址放入葉子節(jié)點胎食,而是直接放入了對應(yīng)的數(shù)據(jù)扰才,這也就是我們平常說到的,Innodb的索引文件就是數(shù)據(jù)文件厕怜,
那么對于Innodb的輔助索引結(jié)構(gòu)跟主索引也相差很多衩匣,如圖:
我們可以發(fā)現(xiàn)蕾总,這里葉子節(jié)點存儲的是主鍵的信息,所以我們在利用輔助索引的時候琅捏,檢索到主鍵信息生百,然后再通過主鍵去主索引中定位表中的數(shù)據(jù),這就可以說明Innodb中主鍵之所以不宜用過長的字段柄延,由于所有的輔助索引都包含主索引蚀浆,所以很容易讓輔助索引變得龐大。
我們還可以發(fā)現(xiàn):在Innodb中盡量使用自增的主鍵拦焚,這樣每次增加數(shù)據(jù)時只需要在后面添加即可蜡坊,非單調(diào)的主鍵在插入時會需要維持B+tree特性而進行分裂調(diào)整,十分低效赎败。
Btree是按照從左到右的順序來建立搜索樹的。比如索引是(name,age,sex)蠢甲,會先檢查name字段僵刮,如果name字段相同再去檢查后兩個字段。
所以當傳進來的是后兩個字段的數(shù)據(jù)(age鹦牛,sex)搞糕,因為建立搜索樹的時候是按照第一個字段建立的,所以必須根據(jù)name字段才能知道下一個字段去哪里查詢曼追。
所以傳進來的是(name窍仰,sex)時,首先會根據(jù)name指定搜索方向礼殊,但是第二個字段缺失驹吮,所以將name字段正確的都找到后,然后才會去匹配sex的數(shù)據(jù)晶伦。
1碟狞、利用最左前綴:Mysql會一直向右查找直到遇到范圍操作(>,<婚陪,like族沃、between)就停止匹配。比如a=1?and?b=2?and?c>3?and?d=6泌参;此時如果建立了(a,b,c,d)索引脆淹,那么后面的d索引是完全沒有用到,當換成了(a,b,d,c)就可以用到沽一。
2盖溺、不能過度索引:在修改表內(nèi)容的時候,索引必須更新或者重構(gòu)锯玛,所以索引過多時咐柜,會消耗更多的時間兼蜈。
3、盡量擴展索引而不要新建索引
4拙友、最適合的索引的列是出現(xiàn)在where子句中的列或連接子句中指定的列为狸。
5、不同值較少的列不必要建立索引(性別)遗契。