mysql数据库索引 分区_数据库设计 – 要索引的列太多 – 使用mySQL分区?
我不是
MySQL專家.我的重點(diǎn)是Oracle,但我一直在使用分區(qū)多年,我發(fā)現(xiàn)你的建議用途非常合適,但不是主流對(duì)分區(qū)的理解.
低基數(shù)列的索引
暫且不談索引合并.假設(shè)您的活動(dòng)行有點(diǎn)分散,并且與非活動(dòng)行數(shù)的比率為1:20.假設(shè)您的頁(yè)面大小為8Kb,每個(gè)塊大約需要20行.如果您獲得非常均勻的isactive記錄分布,那么每個(gè)塊幾乎會(huì)有1個(gè).讀取表中的每個(gè)塊/頁(yè)面的全表掃描將比使用索引查找相同的行要快得多.
所以我們說(shuō)它們集中而不是均勻分散.即使它們集中在20%的頁(yè)面甚至10%的頁(yè)面中,即使在這些情況下,全表掃描也可以執(zhí)行索引.
所以現(xiàn)在包括索引合并.如果在掃描ISactive的索引之后并且您沒(méi)有訪問(wèn)該表但是將這些結(jié)果加入到另一個(gè)索引的結(jié)果中,并且最終結(jié)果集將產(chǎn)生讀數(shù),例如,小于塊的5%.然后是,并且isactive和索引合并的索引可能是一個(gè)解決方案.
需要注意的是,MySQL中索引連接的實(shí)現(xiàn)存在很多限制.確保這適用于您的情況.但是你說(shuō)你還有20個(gè)可以搜索的字段.因此,如果您沒(méi)有為所有這些索引編制索引,以便有可用的第二個(gè)索引來(lái)加入IsActive索引,那么您將不會(huì)使用索引合并/連接.
對(duì)低基數(shù)列進(jìn)行分區(qū)
現(xiàn)在,如果你對(duì)該列進(jìn)行分區(qū),那么你將擁有5%的IsActive = True的塊,并且它們將被密集打包.完整分區(qū)掃描將快速生成活動(dòng)記錄列表,并允許將每個(gè)其他謂詞應(yīng)用為過(guò)濾器而不是索引搜索.
但那個(gè)標(biāo)志發(fā)生了變化,對(duì)吧.
在Oracle中,我們有一個(gè)允許我們啟用行遷移的命令.這意味著,當(dāng)Is_Active從True更改為False時(shí),移動(dòng)該行所在的分區(qū).這非常昂貴,但只比索引維護(hù)時(shí)更多,如果您索引該列而不是通過(guò)它進(jìn)行分區(qū).在分區(qū)示例中. Oracle首先使用更新更改行,然后執(zhí)行刪除操作,然后執(zhí)行插入操作.如果您為該列編制索引,則會(huì)對(duì)該行進(jìn)行更新,然后刪除TRUE的索引條目,然后創(chuàng)建False的索引條目.
如果MySQL沒(méi)有行遷移,那么你必須對(duì)你的crud包進(jìn)行編程才能做到這一點(diǎn). UPDATE_ROW_ISACTIVE(pk IN number)程序< ----類似的東西)將執(zhí)行刪除并為您插入. 關(guān)于Konerak的答案 雖然我同意并行訪問(wèn)是分區(qū)的一種用法,但它并不是唯一的.但是,如果您按照他提供的鏈接,頁(yè)面最底部的用戶評(píng)論是:
Beware of having low selectivity indexes on your table. A complex AND/OR WHERE clause will surely make your query very very slow if Index_Merge optimization is being used with an intersect() algorithm.
這似乎與你的情況有關(guān),所以你可以接受FWIW的評(píng)論.
總結(jié)
以上是生活随笔為你收集整理的mysql数据库索引 分区_数据库设计 – 要索引的列太多 – 使用mySQL分区?的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 地图上如何量方位角_楼承板厂家揭秘:压型
- 下一篇: php里面的socket编程,详解PHP