Partition By 子句可用于提高查詢(xún)性能。它降低了存儲(chǔ)需求,并提高了數(shù)據(jù)可管理性。通過(guò)對(duì)大表進(jìn)行分區(qū),可以更快地執(zhí)行僅訪問(wèn)一小部分?jǐn)?shù)據(jù)的查詢(xún)。分區(qū)還可以縮短備份和恢復(fù)時(shí)間。在本文中,我們將通過(guò)語(yǔ)法和各種示例討論 MySQL 中的 Partition By 子句。
簡(jiǎn)介
PARTITION BY 子句的目的是將表的行分組到單獨(dú)的分區(qū)中。當(dāng)使用同一分區(qū)中的其他行對(duì)分區(qū)內(nèi)的特定行執(zhí)行計(jì)算時(shí),這特別有用。
PARTITION BY 子句必須始終在 OVER() 子句中使用。 PARTITION BY 子句創(chuàng)建的分區(qū)也稱(chēng)為窗口。該子句專(zhuān)門(mén)對(duì) RANK()、LEAD() 和 LAG() 等窗口函數(shù)進(jìn)行操作。
如果從 OVER() 子句中排除 PARTITION BY 子句,則整個(gè)表將被視為單個(gè)分區(qū)。
語(yǔ)法
Window_function ( expression ) Over ( partition by expr [order_clause] [frame_clause] )
登錄后復(fù)制
order_clause 和frame_clause 是語(yǔ)法的可選組件。
在 MySQL 中,Partition 子句中的表達(dá)式可以是列名,也可以是內(nèi)置函數(shù)。但是,在標(biāo)準(zhǔn) SQL 中,表達(dá)式中只允許使用列名稱(chēng)。
示例
讓我們以“Hacker”表為例 –
h_id |
h_name |
challenge_id |
分?jǐn)?shù) |
---|---|---|---|
3 |
拉朱 |
111 |
20 |
2 |
密斯萊什 |
111 |
80 |
5 |
樓陀羅 |
112 |
40 |
5 |
莫漢 |
114 |
90 |
4 |
洛汗 |
112 |
30 |
1 |
索漢 |
112 |
40 |
我們需要確定每個(gè)挑戰(zhàn)中每個(gè)黑客的排名。換句話(huà)說(shuō),我們必須列出所有參與挑戰(zhàn)的黑客以及他們?cè)谠撎魬?zhàn)中各自的排名。
為了實(shí)現(xiàn)此目的,我們使用以下查詢(xún):
select challenge_id, h_id, h_name, score, dense_rank() over ( partition by challenge_id order by score desc ) as "rank", from hacker;
登錄后復(fù)制
在此查詢(xún)中,partition by 子句按challenge_id 對(duì)表進(jìn)行分組。
order by 子句按照得分降序?qū)γ總€(gè)分區(qū)中的黑客進(jìn)行排序。
over() 子句指定如何對(duì)窗口函數(shù)rank() 的表行進(jìn)行分區(qū)和排序。
窗口函數(shù)dense_rank()為挑戰(zhàn)的有序分區(qū)中的每個(gè)黑客分配一個(gè)等級(jí)。如果兩個(gè)黑客得分相同,則他們被分配相同的排名。
結(jié)果輸出顯示所有黑客的列表以及他們?cè)诿總€(gè)挑戰(zhàn)中各自的排名 –
challenge_id |
h_id |
h_name |
分?jǐn)?shù) |
排名 |
---|---|---|---|---|
111 |
2 |
密斯萊什 |
80 |
1 |
111 |
3 |
拉朱 |
20 |
2 |
112 |
樓陀羅 |
40 |
1 |
|
112 |
1 |
索漢 |
40 |
1 |
112 |
4 |
洛汗 |
30 |
2 |
114 |
5 |
莫漢 |
90 |
1 |
因此,我們成功獲得了所有黑客的列表以及他們?cè)诿總€(gè)單獨(dú)挑戰(zhàn)中的排名。
PARTITION BY 子句的使用
將表的行分組到單獨(dú)的分區(qū)中,以便對(duì)分區(qū)內(nèi)的特定行執(zhí)行計(jì)算。
降低存儲(chǔ)要求并提高數(shù)據(jù)可管理性。
通過(guò)更快地執(zhí)行僅訪問(wèn)一小部分?jǐn)?shù)據(jù)的查詢(xún)來(lái)提高查詢(xún)性能。
縮短備份和恢復(fù)時(shí)間。
結(jié)論
MySQL 中的 PARTITION BY 子句是一個(gè)有用的工具,用于將表的行分組到單獨(dú)的分區(qū)中,從而提高查詢(xún)性能并減少存儲(chǔ)需求。該子句專(zhuān)門(mén)對(duì) RANK()、LEAD() 和 LAG() 等窗口函數(shù)進(jìn)行操作。語(yǔ)法很簡(jiǎn)單,并且允許子句中使用的表達(dá)式類(lèi)型具有靈活性。上面的示例演示了 PARTITION BY 子句在計(jì)算每個(gè)客戶(hù)的銷(xiāo)售總額時(shí)的功能。通過(guò)利用這一強(qiáng)大的功能,用戶(hù)可以?xún)?yōu)化數(shù)據(jù)庫(kù)性能并提高數(shù)據(jù)可管理性。
以上就是MySQL PARTITION BY 子句的詳細(xì)內(nèi)容,更多請(qǐng)關(guān)注www.92cms.cn其它相關(guān)文章!