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