色综合图-色综合图片-色综合图片二区150p-色综合图区-玖玖国产精品视频-玖玖香蕉视频

您的位置:首頁技術(shù)文章
文章詳情頁

求教一個mysql建表分組索引問題

瀏覽:136日期:2022-06-10 18:20:28

問題描述

我在做一個網(wǎng)站程序,大致要求效果如下。用戶分為1-5這五個級別,數(shù)字越大權(quán)限越高。

我有一堆內(nèi)容,級別越高的用戶可見內(nèi)容越多。例如有內(nèi)容:A、B、C、D、E,用戶組1的可見:A用戶組2的可見:A、B…………用戶組5的可見:A、B、C、D、E如果要實現(xiàn)這種功能,該如何建立數(shù)據(jù)庫索引比較好呢?

之前有朋友跟我說在內(nèi)容(topic)表加上一列'group',寫上可見的用戶等級1-5,然后建立group_tid的聯(lián)合索引。然后查詢tid<100周圍文章(例如當(dāng)前用戶組為3)時的語句就是:SELECT * FROM topic WHERE group>=3 AND tid<100 LIMIT 10;可實際發(fā)現(xiàn)這種索引是先將group>3的所有數(shù)據(jù)讀出來,再進行選擇查詢。假如有100萬條數(shù)據(jù),有50萬個group>3,該語句執(zhí)行就要從50萬條種篩選,效率極低。

看起來單列的索引只適用于group=*這樣的限制條件,而不能是<或>。所以想在此請教各路大神,有沒有過類似的需求?如何正確建立索引或分表?深表感謝!

補充1:其實把問題改變一下,就是如何在mysql兩個索引中使用<或>限定。這是個邏輯問題,目前的group_tid索引建立后類似于下圖:求教一個mysql建表分組索引問題

即便我對group進行了范圍限制,后面的tid還是在group的基礎(chǔ)上按順序排列的。如果我想知道group>1且tid<6的這種情況,不得不先把group2/3全部讀出再篩選。看起來只有重新規(guī)劃表結(jié)構(gòu),各位有沒有類似經(jīng)驗?

補充2:剛才收到了熱心朋友的幫助回答,說這種情況他曾經(jīng)遇到過。解決的方法是修改發(fā)布機制,將符合條件的帖子發(fā)布至各個等級。例如內(nèi)容A的級別是3,那么發(fā)帖時要同時建立三個數(shù)據(jù)行:group=1,tid=Agroup=2,tid=Agroup=3,tid=A這樣在內(nèi)容讀取時直接請求WHERE group=*都可以讀出符合條件內(nèi)容。但這種方法需要添加大量的關(guān)聯(lián)數(shù)據(jù),甚至造成重復(fù),有沒有其他解決途徑呢?

問題解答

回答1:

其實你的思路已經(jīng)很對了。

tid上建立索引,根據(jù)group分表。

如果group >=3的組,在程序中動態(tài)組合sql如下:

select * from group3 where tid < 100union all select * from group4 where tid < 100union all select * from group5 where tid < 100

以上索引生效,邏輯可用。

回答2:

首先說明一下,在 Innodb 中,索引生不生效跟你使用 < 或 > 沒有必然關(guān)系。也不是說用 = 就一定能用上索引。當(dāng)全表查的性能要高于索引檢索查詢時,MySQL 會智能的放棄索引,選擇全表查詢。

如圖:求教一個mysql建表分組索引問題

回到你的問題,如果某個索引,如 tid<100 檢索出的范圍相對較小時,索引是能夠用上的。

如果這兩個索引的結(jié)果集都很大的話,是否考慮添加其他過濾條件,比如根據(jù)創(chuàng)建時間只查近一個月的內(nèi)容。

分頁問題也可以通過主鍵ID來再次過濾。

回答3:

首先,需要明白以下幾點:

對于一個表的查詢,每次最多只使用一個索引

對于聯(lián)合索引,從左往右依次進行數(shù)據(jù)的篩選,所以如果第一個篩選條件針對了大于或者小于的話,第二個篩選條件由于在整個可選區(qū)域內(nèi)沒有確切的索引范圍,所以會將第一個篩選條件篩除來的數(shù)據(jù)都跑一遍

B-Tree索引的結(jié)構(gòu)類似于樹形結(jié)構(gòu),見下圖,聯(lián)合索引從左往右的檢索,起始就是這個結(jié)構(gòu)從上往下查找分支的過程

索引的機制,簡單說來就是創(chuàng)建一個值到數(shù)據(jù)項的對應(yīng)表,這樣可以快速的從某一字段某個值定位到某一行,省卻了跑整個表去找對應(yīng)行的操作,所以比較快

B-Tree索引的結(jié)構(gòu):求教一個mysql建表分組索引問題

然后回到你的問題上,如果要大幅度提高效率,那么聯(lián)合索引的第一步就需要大幅度減少可以用于后續(xù)篩選的數(shù)據(jù)量,所以如果你要查tid < 100的話,先用tid篩選才能夠大幅度減少后續(xù)的B-Tree索引分支,所以如果要用聯(lián)合索引,則應(yīng)該是(tid, group)。

回答4:

group條件的過濾性很差,單獨建立索引意義不大。

根據(jù)你描述的場景,只要tid的值不是太大(幾千的數(shù)量級),針對tid建立索引就可以了。如果還擔(dān)心tid條件過濾后的數(shù)據(jù)量大,可以創(chuàng)建tid,group的組合索引。

回答5:

首先非常感謝各位對我問題的關(guān)注和回答!!問題解決之后針對boxsnake的建議有一個思考,在這里發(fā)一下。group_tid這種索引方式除了解決讀取之外還能解決分頁問題,例如我每頁文章數(shù)量是10,用戶級別為3,那么讀取時分別從group1、group2、group3中,按范圍tid<100各取10篇,即便某group中沒有符合條件的結(jié)果,幾項加起來也可以覆蓋全。

但如果用tid_group這種索引方式來讀取,如果需要group<=3的情況,我不知道該取多少篇文章。比方說取10篇,tid90-tid99,如果他們的group都是4,那么就無法取出符合條件的數(shù)值。而tid_group在限定group之前又必須對tid進行限定,所以就沒法使用了。

相關(guān)文章:
主站蜘蛛池模板: 精品a在线观看 | 成人做爰免费网站 | 国产亚洲免费观看 | 国产欧美日韩高清专区手机版 | 亚洲在线免费观看视频 | 美女张开双腿让男人桶 | 久久精品视频观看 | 日本三级在线观看中文字 | 亚洲看片网 | 91国语精品自产拍在线观看一 | 91精品亚洲| 手机看片手机在线看片 | 欧美在线观看视频一区 | 日本免费高清视频二区 | 91久久国产视频 | 中文字幕视频免费在线观看 | 毛片在线高清免费观看 | 国产主播福利片在线观看 | 步兵精品手机在线观看 | 欧美一级手机免费观看片 | 日本久久免费 | 三级黄色片在线免费观看 | 午夜美女久久久久爽久久 | 黄色网址免费在线 | 国产美女一区二区在线观看 | 免费久草视频 | 一级毛片一级毛片a毛片欧美 | 99久久精品国产一区二区三区 | 高清在线观看自拍视频 | 欧美性色一级在线观看 | 成人综合国产乱在线 | 91老色批网站免费看 | 999久久久精品视频在线观看 | 欧美另类性视频在线看 | 亚洲精品免费网站 | 日韩一级片在线观看 | 99久久综合国产精品免费 | 午夜欧美性欧美 | 久久亚洲欧美成人精品 | 热re91久久精品国产91热 | 欧美一级毛片在线一看 |