對(duì)底層表的封裝,意味著索引也是按照分區(qū)的子表定義的,而沒(méi)有全局索引。(所以即使有唯一性索引,在不同子表中可能會(huì)有重復(fù)數(shù)據(jù))
創(chuàng)新互聯(lián)公司是一家專業(yè)提供柘城企業(yè)網(wǎng)站建設(shè),專注與網(wǎng)站設(shè)計(jì)、網(wǎng)站建設(shè)、H5建站、小程序制作等業(yè)務(wù)。10年已為柘城眾多企業(yè)、政府機(jī)構(gòu)等服務(wù)。創(chuàng)新互聯(lián)專業(yè)網(wǎng)站設(shè)計(jì)公司優(yōu)惠進(jìn)行中。
單表數(shù)據(jù)量超大時(shí)索引失效
將單表分區(qū)成數(shù)個(gè)區(qū)域,通過(guò)分區(qū)函數(shù),可以快速地定位到數(shù)據(jù)的區(qū)域。而且相比于索引,分區(qū)不需要額外的數(shù)據(jù)結(jié)構(gòu)記錄每個(gè)分區(qū)的數(shù)據(jù),代價(jià)更低。只需要一個(gè)簡(jiǎn)單的表達(dá)式就可以指向正確的分區(qū)
可以只是用簡(jiǎn)單的分區(qū)方式存放表,不要任何索引,只要將查詢定位到需要的大致數(shù)據(jù)位置,通過(guò)where條件,將需要的數(shù)據(jù)限制在少數(shù)分區(qū)中,則效率是很高的。WARNNING:查詢需要掃描的分區(qū)個(gè)數(shù)限制在一個(gè)很小的數(shù)量。
如果數(shù)據(jù)有明顯的“熱點(diǎn)”,可以將熱點(diǎn)數(shù)據(jù)單獨(dú)放在一個(gè)分區(qū),讓這個(gè)分區(qū)的數(shù)據(jù)能夠有機(jī)會(huì)都緩存在內(nèi)存中。
如果分區(qū)表達(dá)式的值可以是NULL:第一個(gè)分區(qū)會(huì)使一個(gè)特殊分區(qū)。以partition by range year(order_date)為例,所有在order_date列為NULL或者非法值的數(shù)據(jù)都會(huì)被放到第一個(gè)分區(qū)。那么所有的查詢?cè)诙ㄎ环謪^(qū)后都會(huì)增加掃描第一個(gè)分區(qū)。而且如果第一個(gè)分區(qū)很大的時(shí)候,查詢的成本會(huì)被這個(gè)“拖油瓶”分區(qū)無(wú)情的增加。
創(chuàng)建一個(gè)無(wú)用的第一分區(qū)可以解決這個(gè)問(wèn)題,partition p_nulls values less than (0);
對(duì)于分區(qū)列和索引列不匹配的查詢,雖然查詢能夠使用索引,但是無(wú)法通過(guò)分區(qū)定位到目標(biāo)數(shù)據(jù)的分區(qū)(也就是數(shù)據(jù)分布相對(duì)更加分散),需要遍歷每個(gè)分區(qū)內(nèi)的索引,除非查詢中的條件同時(shí)也包含分區(qū)條件。所以期望分區(qū)條件范圍被熱門(mén)查詢索引所包含。
對(duì)于 范圍分區(qū) 技術(shù),需要適當(dāng)限制分區(qū)的數(shù)量,否則對(duì)于大量數(shù)據(jù)批量導(dǎo)入的場(chǎng)景,選擇分區(qū)的成本過(guò)高。對(duì)于大多數(shù)系統(tǒng),100個(gè)左右的分區(qū)是沒(méi)有問(wèn)題的。
可以看mysql的data文件夾下面的數(shù)據(jù)庫(kù)文件,就可以查看當(dāng)前分區(qū)情況。
還有幾種獲取MySQL分區(qū)表信息的常用方法
SHOW CREATE TABLE
可以查看創(chuàng)建分區(qū)表的CREATE語(yǔ)句
SHOW TABLE STATUS
可以查看表是否為分區(qū)表
查看INFORMATION_SCHEMA.PARTITIONS表
可以查看表具有哪幾個(gè)分區(qū)、分區(qū)的方法、分區(qū)中數(shù)據(jù)的記錄數(shù)等重要信息
select * from 表 partition (分區(qū)表名); --不管是1級(jí)分區(qū)還是2級(jí)分區(qū)都是用partition
select partition_name , subpartition_name from information_schema.partitions where table_schema='你的數(shù)據(jù)庫(kù)名' and table_name='你的表名'; (這個(gè)語(yǔ)句可以查到你的表的分區(qū)名是什么,1級(jí)分區(qū)和2級(jí)分區(qū)都可以看)
當(dāng)數(shù)據(jù)表中的數(shù)據(jù)量很大時(shí),分區(qū)帶來(lái)的效率提升才會(huì)顯現(xiàn)出來(lái)。
只有檢索字段為分區(qū)字段時(shí),分區(qū)帶來(lái)的效率提升才會(huì)比較明顯。因此, 分區(qū)字段的選擇很重要 ,并且 業(yè)務(wù)邏輯要盡可能地根據(jù)分區(qū)字段做相應(yīng)調(diào)整 (盡量使用分區(qū)字段作為查詢條件)。
1、分區(qū)表對(duì)業(yè)務(wù)透明,只需要維護(hù)一個(gè)表的數(shù)據(jù)結(jié)構(gòu)。
2、DML操作加鎖僅影響操作的分區(qū),不會(huì)影響未訪問(wèn)分區(qū)。
3、通過(guò)分區(qū)交換快速將數(shù)據(jù)換入和換出分區(qū)表。
4、通過(guò)TRUNCATE操作快速清理特定分區(qū)數(shù)據(jù)。
5、通過(guò)強(qiáng)制分區(qū)僅訪問(wèn)特定分區(qū)數(shù)據(jù),減少操作影響。
6、通過(guò)大數(shù)據(jù)量分區(qū)能有效降低索引層數(shù),提高查詢性能。
1、創(chuàng)建表時(shí)指定分區(qū)
物理文件:
2、插入數(shù)據(jù)
3、查詢 information_schema.partitions 表得到該表的分區(qū)信息
4、查詢計(jì)劃分析
5、添加分區(qū)
若報(bào)錯(cuò):
6、修改/覆蓋/合并分區(qū)
報(bào)錯(cuò)
所以需要添加pmax 分區(qū),一同修改
7、刪除分區(qū)
8、查詢具體分區(qū)的下數(shù)據(jù)
MySQL分區(qū)的限制
一、查詢mysql表是否為分區(qū)表:可以查看表具有哪幾個(gè)分區(qū)、分區(qū)的方法、分區(qū)中數(shù)據(jù)的記錄數(shù)等信息
SELECT PARTITION_NAME,PARTITION_METHOD,PARTITION_EXPRESSION,PARTITION_DESCRIPTION,TABLE_ROWS,SUBPARTITION_NAME,SUBPARTITION_METHOD,SUBPARTITION_EXPRESSION
FROM information_schema.PARTITIONS WHERE TABLE_SCHEMA=SCHEMA() AND TABLE_NAME='xw_coobill_order';
二、查詢表有多少個(gè)分區(qū)
SELECT TABLE_NAME, COUNT(*) AS CNT
FROM information_schema.PARTITIONS WHERE PARTITION_NAME IS NOT NULL
GROUP BY TABLE_NAME ORDER BY CNT DESC LIMIT 50;
三、分析執(zhí)行語(yǔ)句
explain partitions select * from range_datetime where hiredate = '20151207124503' and hiredate='20151210111230';
四、分區(qū)管理
常規(guī)HASH和線性HASH的增加收縮分區(qū)的原理是一樣的。增加和收縮分區(qū)后原來(lái)的數(shù)據(jù)會(huì)根據(jù)現(xiàn)有的分區(qū)數(shù)量重新分布。HASH分區(qū)不能刪除分區(qū),所以不能使用DROP PARTITION操作進(jìn)行分區(qū)刪除操作;
只能通過(guò)ALTER TABLE ... COALESCE PARTITION num來(lái)合并分區(qū),這里的num是減去的分區(qū)數(shù)量;
可以通過(guò)ALTER TABLE ... ADD PARTITION PARTITIONS num來(lái)增加分區(qū),這里是null是在原先基礎(chǔ)上再增加的分區(qū)數(shù)量。