真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

安裝mysql怎么分區(qū),mysql 建分區(qū)

Mysql分區(qū)表Partition

一、背景

創(chuàng)新互聯(lián)建站主營南山網(wǎng)站建設(shè)的網(wǎng)絡(luò)公司,主營網(wǎng)站建設(shè)方案,成都App制作,南山h5成都小程序開發(fā)搭建,南山網(wǎng)站營銷推廣歡迎南山等地區(qū)企業(yè)咨詢

話說風(fēng)和日麗的一天,為提高隨著業(yè)務(wù)增長的大表(3510449行吧)的訪問效率,于是決定對表分區(qū),記錄如下。

二、實(shí)操

結(jié)合業(yè)務(wù),若干條記錄會集中在一個日期,查詢時也往往只查詢一個日期內(nèi)的數(shù)據(jù),于是選取分區(qū)字段為時間。

創(chuàng)建分區(qū) 比如

CREATE TABLE message_all (

id int(10) NOT NULL AUTO_INCREMENT,

......

createtime datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '創(chuàng)建時間'

PRIMARY KEY ( id , createtime )

) ENGINE=InnoDB DEFAULT CHARSET=utf8

PARTITION BY RANGE (YEAR(createtime))

(PARTITION p2015 VALUES LESS THAN (2016) ENGINE = InnoDB,

PARTITION p2016 VALUES LESS THAN (2017) ENGINE = InnoDB,

PARTITION p2017 VALUES LESS THAN (2018) ENGINE = InnoDB,

PARTITION p2018 VALUES LESS THAN MAXVALUE ENGINE = InnoDB)

不過我們表已經(jīng)有了當(dāng)然不能這么建,除非你想導(dǎo)一次數(shù)據(jù)。

如下操作 :

1、

ALTER TABLE message_all PARTITION BY RANGE (to_days(createtime))

(

PARTITION p2015 VALUES LESS THAN (to_days('2016-01-01')),

PARTITION p2016 VALUES LESS THAN (to_days('2017-01-01')),

PARTITION p2017 VALUES LESS THAN (to_days('2018-01-01')),

PARTITION p2018 VALUES LESS THAN MAXVALUE

);

或者

2、ALTER TABLE message_all PARTITION BY RANGE (YEAR(createtime))

(

PARTITION p2015 VALUES LESS THAN (YEAR('2016-01-01'))

);

然后追加。

ALTER TABLE message_all ADD PARTITION

(

PARTITION p2016 VALUES LESS THAN (YEAR('2017-01-01')),

PARTITION p2017 VALUES LESS THAN (YEAR('2018-01-01')),

PARTITION p2018 VALUES LESS THAN MAXVALUE

);

這里會有幾種錯誤情況:

1、ALTER TABLE message_all PARTITION BY RANGE (to_days(createtime)) ;

[Err] 1492 - For RANGE partitions each partition must be defined

解釋:必須指定至少一個分區(qū)。

2、[Err] 1492 - A PRIMARY KEY must include all columns in the table's partitioning function

解釋:分區(qū)字段必須是主鍵之一。

3、[Err] 1492 - Constant, random or timezone-dependent expressions in (sub)partitioning function are not allowed

解釋:分區(qū)字段為timestamp,換成datetime。

4、[Err] 1526 - Table has no partition for value xxxx

解釋:用追加方式第一次必須覆蓋目前所有數(shù)據(jù)。

總結(jié):

1、創(chuàng)建時必須指定至少一個分區(qū)。

2、key必須為主鍵之一。

3、RANGE處必須為INT型,時間字段用函數(shù)轉(zhuǎn)——YEAR()、YEARWEEK()、TO_DAYS()。

4、THAN處必須為INT型,時間字段用函數(shù)轉(zhuǎn)——TO_DAYS、TO_SECONDS()、UNIX_TIMESTAMP()。

5、它就是以兩個INT比大小劃分的文件。

6、所有ENGINE必須一樣。

7、范圍分區(qū)添加只能在最大值后面追加。

8、分區(qū)是有上限的貌似1024個。

用到的其他操作

1、刪除分區(qū)(直接扔掉分區(qū)文件,數(shù)據(jù)也沒了)

ALTER TABLE message_all DROP PARTITION p2016;

2、清空分區(qū)數(shù)據(jù)

ALTER TABLE message_all TRUNCATE PARTITION p2017;

3、重定義(可實(shí)現(xiàn):分區(qū)拆分、合并、重命名)

ALTER TABLE message_all REORGANIZE PARTITION p201601,p201602,p201603,p201604 INTO

(

PARTITION p2016012 VALUES less than(TO_DAYS('2016-03-01')),

PARTITION p2016034 VALUES less than(TO_DAYS('2016-05-01'))

);

檢查/查看你的分區(qū)

1、SHOW TABLE STATUS LIKE 'message_all';

2、SELECT * FROM information_schema.partitions WHERE table_name='message_all';

3、SHOW CREATE TABLE message_all;

4、EXPLAIN SELECT COUNT(1) FROM message_all WHERE createtime= '2016-01-01' AND createtime '2016-12-30';如果用到了分區(qū)partitions里會有顯示。

5、指定分區(qū)查

SELECT COUNT(1) FROM message_all PARTITION (p2016) 表別名 WHERE ......;

到這里就結(jié)束啦,土豆白。

一些概念

水平分區(qū)Partition有以下幾種模式

MySQL-分區(qū)表

對底層表的封裝,意味著索引也是按照分區(qū)的子表定義的,而沒有全局索引。(所以即使有唯一性索引,在不同子表中可能會有重復(fù)數(shù)據(jù))

單表數(shù)據(jù)量超大時索引失效

將單表分區(qū)成數(shù)個區(qū)域,通過分區(qū)函數(shù),可以快速地定位到數(shù)據(jù)的區(qū)域。而且相比于索引,分區(qū)不需要額外的數(shù)據(jù)結(jié)構(gòu)記錄每個分區(qū)的數(shù)據(jù),代價更低。只需要一個簡單的表達(dá)式就可以指向正確的分區(qū)

可以只是用簡單的分區(qū)方式存放表,不要任何索引,只要將查詢定位到需要的大致數(shù)據(jù)位置,通過where條件,將需要的數(shù)據(jù)限制在少數(shù)分區(qū)中,則效率是很高的。WARNNING:查詢需要掃描的分區(qū)個數(shù)限制在一個很小的數(shù)量。

如果數(shù)據(jù)有明顯的“熱點(diǎn)”,可以將熱點(diǎn)數(shù)據(jù)單獨(dú)放在一個分區(qū),讓這個分區(qū)的數(shù)據(jù)能夠有機(jī)會都緩存在內(nèi)存中。

如果分區(qū)表達(dá)式的值可以是NULL:第一個分區(qū)會使一個特殊分區(qū)。以partition by range year(order_date)為例,所有在order_date列為NULL或者非法值的數(shù)據(jù)都會被放到第一個分區(qū)。那么所有的查詢在定位分區(qū)后都會增加掃描第一個分區(qū)。而且如果第一個分區(qū)很大的時候,查詢的成本會被這個“拖油瓶”分區(qū)無情的增加。

創(chuàng)建一個無用的第一分區(qū)可以解決這個問題,partition p_nulls values less than (0);

對于分區(qū)列和索引列不匹配的查詢,雖然查詢能夠使用索引,但是無法通過分區(qū)定位到目標(biāo)數(shù)據(jù)的分區(qū)(也就是數(shù)據(jù)分布相對更加分散),需要遍歷每個分區(qū)內(nèi)的索引,除非查詢中的條件同時也包含分區(qū)條件。所以期望分區(qū)條件范圍被熱門查詢索引所包含。

對于 范圍分區(qū) 技術(shù),需要適當(dāng)限制分區(qū)的數(shù)量,否則對于大量數(shù)據(jù)批量導(dǎo)入的場景,選擇分區(qū)的成本過高。對于大多數(shù)系統(tǒng),100個左右的分區(qū)是沒有問題的。

mysql 分區(qū)PARTITIONS之基本使用

當(dāng)數(shù)據(jù)表中的數(shù)據(jù)量很大時,分區(qū)帶來的效率提升才會顯現(xiàn)出來。

只有檢索字段為分區(qū)字段時,分區(qū)帶來的效率提升才會比較明顯。因此, 分區(qū)字段的選擇很重要 ,并且 業(yè)務(wù)邏輯要盡可能地根據(jù)分區(qū)字段做相應(yīng)調(diào)整 (盡量使用分區(qū)字段作為查詢條件)。

1、分區(qū)表對業(yè)務(wù)透明,只需要維護(hù)一個表的數(shù)據(jù)結(jié)構(gòu)。

2、DML操作加鎖僅影響操作的分區(qū),不會影響未訪問分區(qū)。

3、通過分區(qū)交換快速將數(shù)據(jù)換入和換出分區(qū)表。

4、通過TRUNCATE操作快速清理特定分區(qū)數(shù)據(jù)。

5、通過強(qiáng)制分區(qū)僅訪問特定分區(qū)數(shù)據(jù),減少操作影響。

6、通過大數(shù)據(jù)量分區(qū)能有效降低索引層數(shù),提高查詢性能。

1、創(chuàng)建表時指定分區(qū)

物理文件:

2、插入數(shù)據(jù)

3、查詢 information_schema.partitions 表得到該表的分區(qū)信息

4、查詢計劃分析

5、添加分區(qū)

若報錯:

6、修改/覆蓋/合并分區(qū)

報錯

所以需要添加pmax 分區(qū),一同修改

7、刪除分區(qū)

8、查詢具體分區(qū)的下數(shù)據(jù)

MySQL分區(qū)的限制


網(wǎng)站題目:安裝mysql怎么分區(qū),mysql 建分區(qū)
文章地址:http://weahome.cn/article/hsegje.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部