mysql 字符列做日期分区_mysql 根据日期字段做表分区
mysql 的表分區有幾種類型, list, hash, range等, 今天我們介紹下日期分區, 假如與如下表:
新建mysql分區表CREATE?TABLE?core(???core_id?INT?NOT?NULL?AUTO_INCREMENT,???stamp?DATETIME,???data?VARCHAR(80),???PRIMARY?KEY(core_id,stamp)?)?PARTITION?BY?LIST(TO_DAYS(stamp))(???PARTITION?core_20100715?VALUES?IN?(TO_DAYS('2010-07-15')),???PARTITION?core_20100716?VALUES?IN?(TO_DAYS('2010-07-16'))?);
需要注意分區列必須包含在主鍵中, 否則mysql會報錯。
測試分區表
我們向表中插入一條數據:INSERT?INTO?core?(stamp,data)?VALUES?('20100715','a')
上面的sql語句應該會順利執行, 我們插入的日期范圍在分區字段指定的范圍內。
那么如果我們插入一條數據日期范圍不再分區字段范圍內,會如何呢?INSERT?INTO?core?(stamp,data)?VALUES?('20100717','x')
mysql會報錯:Error?Code:?1526.?Table?has?no?partition?for?value?734335
我們可以通過mysql的系統表information_schema.PARTITIONS查看分區的信息:SELECT?*?FROM?information_schema.PARTITIONS?WHERE?TABLE_NAME='core';
sql執行的內容如下:TABLE_CATALOG?TABLE_SCHEMA?TABLE_NAME?PARTITION_NAME?SUBPARTITION_NAME?PARTITION_ORDINAL_POSITION?SUBPARTITION_ORDINAL_POSITION?PARTITION_METHOD?SUBPARTITION_METHOD?PARTITION_EXPRESSION?SUBPARTITION_EXPRESSION?PARTITION_DESCRIPTION?TABLE_ROWS?AVG_ROW_LENGTH?DATA_LENGTH?MAX_DATA_LENGTH?INDEX_LENGTH?DATA_FREE?CREATE_TIME?UPDATE_TIME?CHECK_TIME?CHECKSUM?PARTITION_COMMENT?NODEGROUP?TABLESPACE_NAME?NULL?test?core?core_20100715?NULL?1?NULL?LIST?NULL?TO_DAYS(stamp)?NULL?734333?0?0?16384?NULL?0?4194304?NULL?NULL?NULL?NULL?default?NULL?NULL?test?core?core_20100716?NULL?2?NULL?LIST?NULL?TO_DAYS(stamp)?NULL?734334?0?0?16384?NULL?0?4194304?NULL?NULL?NULL?NULL?default?NULL
和我們的預期是一致的
可以通過下面的sql語句來添加新的分區, 如下sql給表新添一個分區ALTER?TABLE?core?ADD?PARTITION?(PARTITION?core_20100717?VALUES?IN?(TO_DAYS('2010-07-17')));
下面的sql語句可以刪除一個分區:ALTER?TABLE?core?DROP?PARTITION?core_20100717;
如果表創建的時候沒有創建分區,我們可以通過alter table來給表添上分區設置,如下sqlALTER?TABLE?core?PARTITION?BY?LIST(TO_DAYS(stamp))(???PARTITION?core_20100715?VALUES?IN?(TO_DAYS('2010-07-15')),???PARTITION?core_20100716?VALUES?IN?(TO_DAYS('2010-07-16'))?);
如果要給現有表刪除分區,可以通過下面的sql來操作:ALTER?TABLE?core?REMOVE?PARTITIONING;
添加和刪除分區并不會影響表中的數據, 但是添加分區時分區必須可以覆蓋表中現有的數據
如果服務器上有多塊磁盤,可以將不同的分區對應文件放到不同的磁盤上
如下sql語句將不同的分區放到了不同的目錄上面了ALTER?TABLE?core?PARTITION?BY?LIST(TO_DAYS(stamp))(???PARTITION?p20100715?VALUES?IN?(TO_DAYS('2010-07-15'))???DATA?DIRECTORY?'/data/2010-07-15'???INDEX?DIRECTORY?'/data/2010-07-15',???PARTITION?p20100716?VALUES?IN?(TO_DAYS('2010-07-16'))???DATA?DIRECTORY?'/data/2010-07-16'???INDEX?DIRECTORY?'/data/2010-07-16'?);
在執行上面的sql時有可能會遇到下面的錯誤You?may?get?this?error:?SQL?Error?(1210):?Incorrect?arguments?to?DATA?DIRECTORY
出現這個錯誤可能是因為這個目錄已經被其他mysql分區占用了, 分區路徑不能是mysql當前的數據路徑。 如果給分區指定路徑,最好獨立于mysql數據文件路徑
mysql官方文檔,分區資料很全面,可以作為參考
原文鏈接:http://outofmemory.cn/mysql/mysql-partition-by-date
打開App,閱讀手記
總結
以上是生活随笔為你收集整理的mysql 字符列做日期分区_mysql 根据日期字段做表分区的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: success 已正常处理 hide_最
- 下一篇: mysql触发器行锁_MySQL 之 视