網(wǎng)站跟自媒體建設(shè)已備案域名交易平臺(tái)
本周我們將要講解一下設(shè)計(jì)索引的時(shí)候,我們通常應(yīng)該考慮哪些因素,給哪些字段建立索引,如何建立索引,建立好索引之后應(yīng)該如何使用才是最合適的。
可能有的朋友會(huì)希望盡快更新后面的內(nèi)容,但是因?yàn)楣ぷ鞯脑虻拇_非常忙,也很少有周末時(shí)間,目前一周三更也是竭盡全力了,希望大家理解一下。
此外可以告訴大家的一個(gè)好消息是,下周開(kāi)始將會(huì)開(kāi)啟為期兩周的案例實(shí)戰(zhàn)部分,也就是我們將會(huì)以一個(gè)電商平臺(tái)的商品系統(tǒng)、交易系統(tǒng)以及營(yíng)銷系統(tǒng)的表結(jié)構(gòu)設(shè)計(jì)以及索引設(shè)計(jì)作為案例背景,來(lái)告訴大家在實(shí)際的系統(tǒng)設(shè)計(jì)中,應(yīng)該如何設(shè)計(jì)表結(jié)構(gòu)以及索引。
接下來(lái)的這個(gè)案例將會(huì)包含商品表、商品詳情表、訂單表、物流表、退款表、購(gòu)物車表、營(yíng)銷活動(dòng)表,等多個(gè)表的設(shè)計(jì),幫助大家在電商場(chǎng)景下去學(xué)習(xí)表結(jié)構(gòu)的設(shè)計(jì),以及針對(duì)具體的業(yè)務(wù)場(chǎng)景如何設(shè)計(jì)索引,這就跟我們最近學(xué)習(xí)的索引部分完全關(guān)聯(lián)上了。
好了,那么接著就開(kāi)始本周的索引設(shè)計(jì)一般原則的講解吧。
首先,我們?cè)卺槍?duì)業(yè)務(wù)需求建立好一張表的結(jié)構(gòu)之后,就知道這個(gè)表有哪些字段,每個(gè)字段是什么類型的,會(huì)包含哪些數(shù)據(jù)
接著設(shè)計(jì)好表結(jié)構(gòu)之后,接下來(lái)要做的,就是要設(shè)計(jì)表的索引,這個(gè)設(shè)計(jì)索引的時(shí)候,我們要考慮第一點(diǎn),就是未來(lái)我們對(duì)表進(jìn)行查詢的時(shí)候,大概會(huì)如何來(lái)進(jìn)行查詢?
其實(shí)很多時(shí)候很多人可能說(shuō),你要讓我剛設(shè)計(jì)完表結(jié)構(gòu)就知道未來(lái)會(huì)怎么查詢表,那我怎么可能知道呢,實(shí)在是想不出來(lái)!
好,那么沒(méi)關(guān)系,此時(shí)我們完全可以在表結(jié)構(gòu)設(shè)計(jì)完畢之后,先別急著設(shè)計(jì)索引,因?yàn)榇藭r(shí)你根本不知道要怎么查詢表。
接著我們就可以進(jìn)入系統(tǒng)開(kāi)發(fā)的環(huán)節(jié),也就是說(shuō)根據(jù)需求文檔逐步逐步的把你的Java業(yè)務(wù)代碼給寫(xiě)好,在寫(xiě)代碼的過(guò)程中,現(xiàn)在一般我們都是用MyBatis作為數(shù)據(jù)持久層的框架的,你肯定會(huì)寫(xiě)很多的MyBatis的DAO和Mapper以及SQL吧?
那么當(dāng)你系統(tǒng)差不多開(kāi)發(fā)完畢了,功能都跑通了,此時(shí)你就可以來(lái)考慮如何建立索引了,因?yàn)槟愕南到y(tǒng)里所有的MyBatis的SQL語(yǔ)句都已經(jīng)寫(xiě)完了,你完全知道對(duì)每一張表會(huì)發(fā)起些什么樣的查詢語(yǔ)句,對(duì)吧?
那么這個(gè)時(shí)候,第一個(gè)索引設(shè)計(jì)原則就來(lái)了,針對(duì)你的SQL語(yǔ)句里的where條件、order by條件以及group by條件去設(shè)計(jì)索引
也就是說(shuō),你的where條件里要根據(jù)哪些字段來(lái)篩選數(shù)據(jù)?order by要根據(jù)哪些字段來(lái)排序?group by要根據(jù)哪些字段來(lái)分組聚合?
此時(shí)你就可以設(shè)計(jì)一個(gè)或者兩三個(gè)聯(lián)合索引,每一個(gè)聯(lián)合索引都盡量去包含上你的where、order by、group by里的字段,接著你就要仔細(xì)審查每個(gè)SQL語(yǔ)句,是不是每個(gè)where、order by、group by后面跟的字段順序,都是某個(gè)聯(lián)合索引的最左側(cè)字段開(kāi)始的部分字段?
比如你有一個(gè)聯(lián)合索引是INDEX(a,b,c),此時(shí)你一看發(fā)現(xiàn)有三個(gè)SQL,包含了where a=? and b=?,order by a,b,group by a這些部分,那么此時(shí)where、order by、group by后續(xù)跟的字段都是聯(lián)合索引的最左側(cè)開(kāi)始的部分字段,這就可以了,說(shuō)明你的每個(gè)SQL語(yǔ)句都會(huì)用上你的索引了。
所以在設(shè)計(jì)索引的時(shí)候,首先第一條,就是要按照這個(gè)原則,去保證你的每個(gè)SQL語(yǔ)句的where、order by和group by都可以用上索引。