【轉載】實戰mysql分區(PARTITION)

来源:http://www.cnblogs.com/xujishou/archive/2017/02/09/6382283.html
-Advertisement-
Play Games

轉載地址:http://lobert.iteye.com/blog/1955841 前些天拿到一個表,將近有4000w數據,沒有任何索引,主鍵。(建這表的絕對是個人才) 這是一個日誌表,記錄了游戲中物品的產出與消耗,原先有一個後臺對這個表進行統計。。。。。(這要用超級電腦才能統計得出來吧),只能幫 ...


轉載地址:http://lobert.iteye.com/blog/1955841

前些天拿到一個表,將近有4000w數據,沒有任何索引,主鍵。(建這表的絕對是個人才)

這是一個日誌表,記錄了游戲中物品的產出與消耗,原先有一個後臺對這個表進行統計。。。。。(這要用超級電腦才能統計得出來吧),只能幫前人填坑了。。。。

數據太大,決定用分區來重構。


如果你發現是empty,說明你的mysql版本不夠,分區至少要5.1

下麵針對業務查詢,決定用時間來做range分區(還有list,hash等類型),一個月一個區.

按照RANGE分區的表是通過如下一種方式進行分區的,每個分區包含那些分區表達式的值位於一個給定的連續區間內的行。這些區間要連續且不能相互重疊,使用VALUES LESS THAN操作符來進行定義。

新建一個表:

Sql代碼  
  1. CREATE TABLE `xxxxxxxx` (     
  2. `crttm` int(11) NOT NULL,     
  3. `srvid` int(11) NOT NULL,     
  4. `evtid` int(11) NOT NULL,     
  5. `aid` int(11) NOT NULL,     
  6. `rid` int(11) NOT NULL,     
  7. `itmid` int(11) NOT NULL,     
  8. `itmnum` int(11) NOT NULL,     
  9. `gdtype` int(11) NOT NULL,     
  10. `gdnum` int(11) NOT NULL,     
  11. `islmt` int(11) NOT NULL,  
  12. KEY `crttm` (`crttm`),  
  13.   KEY `itemid` (`itmid`),  
  14.   KEY `srvid` (`srvid`),  
  15.   KEY `gdtype` (`gdtype`)  
  16. ) ENGINE=myisam DEFAULT CHARSET=utf8  
  17. PARTITION BY RANGE (crttm)   
  18. (  
  19. PARTITION p201303 VALUES LESS THAN (unix_timestamp('2013-04-01')),  
  20. PARTITION p201304 VALUES LESS THAN (unix_timestamp('2013-05-01')),  
  21. PARTITION p201305 VALUES LESS THAN (unix_timestamp('2013-06-01')),  
  22. PARTITION p201306 VALUES LESS THAN (unix_timestamp('2013-07-01')),  
  23. PARTITION p201307 VALUES LESS THAN (unix_timestamp('2013-08-01')),  
  24. PARTITION p201308 VALUES LESS THAN (unix_timestamp('2013-09-01')),  
  25. PARTITION p201309 VALUES LESS THAN (unix_timestamp('2013-10-01')),  
  26. PARTITION p201310 VALUES LESS THAN (unix_timestamp('2013-11-01')),  
  27. PARTITION p201311 VALUES LESS THAN (unix_timestamp('2013-12-01')),  
  28. PARTITION p201312 VALUES LESS THAN (unix_timestamp('2014-01-01')),  
  29. PARTITION p201401 VALUES LESS THAN (unix_timestamp('2014-02-01'))  
  30. );  

 

註意: 

 

 

1. primary key和unique key必須包含在分區key的一部分,否則在創建primary key和unique index時會報”ERROR 1503 (HY000)“

mysql> create unique index idx_employees1_job_code on employees1(job_code);
ERROR 1503 (HY000): A UNIQUE INDEX must include all columns in the table's partitioning function

mysql> ALTER TABLE `skate`.`employees1` ADD PRIMARY KEY (`id`) ;
ERROR 1503 (HY000): A PRIMARY KEY must include all columns in the table's partitioning function

2. 範圍分區添加分區只能在最大值後面追加分區
3. 所有分區的engine必須一樣
4. 範圍分區分區欄位:integer、數值表達式、日期列,日期函數表達式(如year(),to_days(),to_seconds(),unix_timestamp())

 

將舊的表數據導入到新表後,看到新表的數據都分佈到不同的區了!



 

維護命令:


添加分區

Sql代碼  收藏代碼
  1. alter table xxxxxxx add partition (partition p0 values less than(1991));  //只能添加大於分區鍵的分區  

 

 

刪除分區

Sql代碼  收藏代碼
  1. alter table xxxxxxx drop partition p0; //可以刪除任意分區  

 

 

刪除分區數據

Sql代碼  收藏代碼
  1. alter table xxxxxx  truncate partition p1,p2;  
  2. alter table xxxxxx  truncate partition all;  
  3. 或  
  4. delete from xxxxxx where separated < '2006-01-01' or (separated >= '2006-01-01' and separated<'2011-01-01');  

 

 

重定義分區(包括重命名分區,伴隨移動數據;合併分區)

Sql代碼  
  1. alter table xxxxx reorganize partition p1,p3,p4 into (partition pm1 values less than(2006),  
  2. partition pm2 values less than(2011));  

 
rebuild重建分區

Sql代碼  
  1. alter  table xxxxxx rebuild partition pm1/all; //相當於drop所有記錄,然後再reinsert;可以解決磁碟碎片  

優化表

Sql代碼  
  1. alter  table tt2 optimize partition pm1; //在大量delete表數據後,可以回收空間和碎片整理。但在5.5.30後支持。在5.5.30之前可以通過recreate+analyze來替代,如果用rebuild+analyze速度慢  

analzye表

Sql代碼  
  1. alter  table xxxxxx analyze partition pm1/all;  

 

check表

Sql代碼  
  1. alter  table xxxxxx check partition pm1/all;  

 
 

Sql代碼  
  1. show create table employees2;  //查看分區表的定義  
  2. show table status like 'employees2'\G;    //查看表時候是分區表 如“Create_options: partitioned”  
  3. select * from information_schema.KEY_COLUMN_USAGE where table_name='employees2';   //查看索引  
  4. SELECT * FROM information_schema.partitions WHERE table_name='employees2'   //查看分區表  
  5. explain partitions select * from employees2 where separated < '1990-01-01' or separated > '2016-01-01';   //查看分區是否被select使用  

 

 
您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 一、引言在iOS開發中使用動畫時,可以通過設置動畫的duration、speed、begintime、offset屬性,來設置動畫的時長、速度、起始時間及起始偏移。用一個簡單的例子來說明各個參數的的作用。動畫很簡單,一個紅色的方塊從左移到右邊。動畫的持續時間是1s,沒有重覆,效果如下。 CFTime... ...
  • 首先看一下界面: SharedPreferencesUtils.java ...
  • 一個小故事 某天,小王正在和HR妹妹閑聊,正HAPPY時,,突然收到系統告警消息,資料庫磁碟被剩餘空間500M,OMG,不行,磁碟快滿了,要是業務要停了,,那就小王只能刪庫到跑路了,,, 先檢查下,有沒有可以刪除的不用的文件,結果都是重要的或者拿不准的。先收縮下資料庫吧,點擊運行。等收縮完成就可以繼 ...
  • 1、 " DUAL 表 " 2、 " ROWID 類型 " 2.1、 "利用 ROWID 查詢數據" 2.2、 "利用 ROWID 更新數據" 3、 " NULL 值 " 3.1、 "NULL 與空字元串" 3.2、 "NULL 與函數" 3.3、 "NULL 與索引" 3.4、 "NULL 與 S ...
  • 遇到1000萬數據表 最近遇到一個問題,就是單表數據過1000萬的存儲及查詢問題。舉個例子:1000萬的數據存在一個表中,欄位4 5個樣子,日常 開發中難免要做過濾、排序、分頁。如果把這幾個放在一起即要過濾又要排序,還要分頁那麼數據量大一些就會發現特別慢。 10多年前剛入行時就聽許多的人討論分頁,說 ...
  • 為了保證資料庫中的業務數據不被非授權的用戶非法竊取,需要對資料庫的訪問者進行各種限制,而資料庫安全性控制措施主要有這三種,第一種用戶身份鑒別,手段可以是口令,磁卡,指紋等技術,只有擁有合法身份的人才可以進入資料庫。第二種存取許可權控制,不同角色,對資料庫的存取許可權是不同的,必須為每一個角色設置其訪問的... ...
  • 1.準備安裝源 下載地址: "https://www.postgresql.org/ftp/source/" 下載並解壓。 2.軟體編譯安裝 配置、檢查安裝環境 成功後,方可進入下一步。遇到問題參考 "[configure遇到的問題]" 編譯安裝 3.配置資料庫 內核參數配置 用戶配置 初始化資料庫 ...
  • USE [master] GO /****** Object: StoredProcedure [dbo].[p_comparestructure] Script Date: 02/09/2017 15:39:59 ******/ SET ANSI_NULLS ON GO SET QUOTED_ID... ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...