由于之前的每一個(gè)問(wèn)題都是一個(gè)比較大的知識(shí)點(diǎn)榨了,作者希望可以盡量一一詳細(xì)解答眶蕉,如果有不足的地方歡迎大家補(bǔ)充和修改勋乾,同時(shí)借鑒牛人寫的Mysql中算法的實(shí)現(xiàn)以及內(nèi)存原理执泰,Btree結(jié)構(gòu)等枕磁。
1:MySQL數(shù)據(jù)庫(kù)存儲(chǔ)引擎有MyISAM和innoDB,請(qǐng)問(wèn)這兩種類型的索引是如何存儲(chǔ)的术吝?
現(xiàn)在問(wèn)問(wèn)題已經(jīng)不問(wèn)MySQL有哪些存儲(chǔ)引擎计济,也不問(wèn)MyISAM與innoDB的區(qū)別了嗎晴楔?直接開(kāi)始問(wèn)索引如何存儲(chǔ)的嗎?
????? 這個(gè)還需要從MySQL為什么需要建立索引開(kāi)始說(shuō)起峭咒,索引能夠提高數(shù)據(jù)檢索的效率税弃,降低數(shù)據(jù)庫(kù)的IO成本和排序成本,在數(shù)據(jù)庫(kù)中給字段添加索引凑队,帶來(lái)的最大好處就是該字段作為檢索條件的時(shí)候能夠大大提高我們檢索的效率则果,加快檢索時(shí)間,降低檢索過(guò)程中需要掃描的數(shù)據(jù)量漩氨,但是我們不能一遇到query就給字段添加索引西壮,索引并不是多多益善。
???? 索引是把你設(shè)置為索引的字段A存儲(chǔ)在獨(dú)立區(qū)間S中叫惊,里面只有這個(gè)字段的內(nèi)容款青,在查找這個(gè)字段與字段A的時(shí)候,只需要在區(qū)間S中去查找霍狰,而不是去數(shù)據(jù)庫(kù)中查找抡草,找到符合條件的字段,在去數(shù)據(jù)庫(kù)中尋找與A對(duì)應(yīng)的字段的物理地址蔗坯,再把對(duì)應(yīng)的數(shù)據(jù)讀取出來(lái)康震。如果不添加索引,你查找的就有可能是整個(gè)數(shù)據(jù)庫(kù)這里面會(huì)有大量的多余的字段查找宾濒,不相干的字段腿短,數(shù)據(jù)庫(kù)在判斷不相干字段的過(guò)程中浪費(fèi)了時(shí)間和效率。不是索引越多越好绘梦,你的每一個(gè)索引都是建立在一個(gè)單獨(dú)區(qū)間S中的橘忱,獨(dú)立區(qū)間越大搜索就會(huì)越占用你的資源。
詳情請(qǐng)查看:?http://blog.sina.com.cn/s/blog_8efa3c4f0102wqgs.html
ps:MyIsAm與innoDB區(qū)別:
一卸奉、InnoDB支持事務(wù)钝诚,MyISAM不支持,這一點(diǎn)是非常之重要择卦。事務(wù)是一種高級(jí)的處理方式敲长,如在一些列增刪改中只要哪個(gè)出錯(cuò)還可以回滾還原,而MyISAM就不可以了秉继。
二、MyISAM適合查詢以及插入為主的應(yīng)用泽铛,InnoDB適合頻繁修改以及涉及到安全性較高的應(yīng)用
三尚辑、InnoDB支持外鍵,MyISAM不支持
四盔腔、MyISAM是默認(rèn)引擎杠茬,InnoDB需要指定
五月褥、InnoDB不支持FULLTEXT類型的索引
六、InnoDB中不保存表的行數(shù)瓢喉,如select count(*) from table時(shí)宁赤,InnoDB需要掃描一遍整個(gè)表來(lái)計(jì)算有多少行,但是MyISAM只要簡(jiǎn)單的讀出保存好的行數(shù)即可栓票。注意的是决左,當(dāng)count(*)語(yǔ)句包含where條件時(shí)MyISAM也需要掃描整個(gè)表
七、對(duì)于自增長(zhǎng)的字段走贪,InnoDB中必須包含只有該字段的索引佛猛,但是在MyISAM表中可以和其他字段一起建立聯(lián)合索引
八、清空整個(gè)表時(shí)坠狡,InnoDB是一行一行的刪除继找,效率非常慢。MyISAM則會(huì)重建表
九逃沿、InnoDB支持行鎖(某些情況下還是鎖整表婴渡,如 update table set a=1 where user like '%lee%'