什么是表分区? 对用户来说,分区表是一个独立的逻辑表,但是底层由多个物理子表组成,实现分区的代码实际上是通过对一组底层表的对象封装,但对SQL层来说是一个完全封装底层的黑盒子。 MySQL实现分区的方式也意味着索引也是按照分区的子表定义,没有全局索引。 分区的意思是指将同一表中不同行的记录分配到不同的物理文件中,几个分区就有几个。idb文件。MySQL数据库的分区是局部分区索引,一个分区中既存了数据,又放了索引。也就是说,每个区的聚集索引和非聚集索引都放在各自区的(不同的物理文件)。分区表的好处是 1、可以让单表存储更多的数据。 2、分区表的数据更容易维护,可以通过删除与那些数据有关的分区,更容易删除数据,也可以增加新的分区来支持新插入的数据。另外,还可以对一个独立分区进行优化、检查、修复等操作。 3、部分查询能够从查询条件确定只落在少数分区上,查询速度会很快。 4、通过跨多个磁盘来分散数据查询,来获得更大的查询吞吐量。新建分区表假设有个表叫tmplogs,设置分区条件为按endtime按月分区DROPTABLEIFEXISTSCREATETABLEtmplogs(idint(11)UNSIGNEDNOTNULLAUTOINCREMENT,starttimedatetimeNOTNULL,endtimedatetimeNOTNULL,memovarchar(128)CHARACTERSETutf8mb4NOTNULL,PRIMARYKEY(id,endtime))ENGINEInnoDBDEFAULTCHARSETutf8PARTITIONBYRANGE(TODAYS(endtime))(PARTITIONp202112VALUESLESSTHAN(TODAYS(20220101)),PARTITIONp202201VALUESLESSTHAN(TODAYS(20220201)),PARTITIONp202202VALUESLESSTHAN(TODAYS(20220301)),PARTITIONp202203VALUESLESSTHAN(TODAYS(20220401)));存储过程,每月创建新的分区createtablepartition为创建表分区,调用后为该表创建到下月结束的表分区DELIMITERDROPPROCEDUREIFEXISTScreatetablepartitionCREATEPROCEDUREcreatetablepartition(INtablenamevarchar(64))BEGINSETnextmonthCONCAT(dateformat(dateadd(now(),interval2month),Ym),01);SETnextpCONCAT(dateformat(dateadd(now(),interval1month),Ym));SETSQLCONCAT(ALTERTABLE,tablename,,ADDPARTITION(PARTITIONp,nextp,VALUESLESSTHAN(TODAYS(,nextmonth,))););PREPARESTMTFROMSQL;EXECUTESTMT;DEALLOCATEPREPARESTMT;ENDDELIMITER;存储过程,删除历史分区,空间回收deletetablepartition为删除N月前的表分区,方便ahrefhttps:www。q578。coml140targetblankclassinfotextkey历史a数据空间回收DELIMITERDROPPROCEDUREIFEXISTSdeletetablepartitionCREATEPROCEDUREdeletetablepartition(strtablenameVARCHAR(64),intreservedmonthINT)BEGINDECLAREstrpartnameVARCHAR(64);DECLAREdoneINTDEFAULT0;DECLAREcursor1CURSORFORSELECTpartitionnamefrominformationschema。partitionswheretableschemawebrtcandtablenamestrtablenameandpartitiondescriptionTODAYS(CONCAT(dateformat(datesub(now(),intervalintreservedmonthmonth),Ym),01));DECLARECONTINUEHANDLERFORSQLSTATE02000SETdone1;opencursor1;readloop:LOOPFETCHcursor1INTOIFdone1THENLEAVEENDIF;SETSQLCONCAT(ALTERTABLE,strtablename,DROPPARTITION,strpartname,;);PREPARESTMTFROMSQL;EXECUTESTMT;DEALLOCATEPREPARESTMT;ENDLOOP;CLOSEcursor1;ENDDELIMITER;触发器,每月自动新建分区,并删除旧分区创建一个Event,每个月的一号凌晨1点执行存储过程,自动创建创建表分区,同时最多保存6个月的数据DELIMITERCREATEEVENTIFNOTEXISTSeventrecordsautopartitionONSCHEDULEEVERY1MONTHSTARTSDATEADD(DATEADD(DATESUB(CURDATE(),INTERVALDAY(CURDATE())1DAY),INTERVAL1MONTH),INTERVAL1HOUR)ONCOMPLETIONPRESERVEENABLEDOBEGINcallcreatetablepartition(tmplogs);calldeletetablepartition(tmplogs,18);ENDDELIMITER;备注,MySQLEVENT操作事项: 要使定时事件起作用,MySQL的常量GLOBALeventscheduler必须为on或者是1。 1、查看scheduler的当前状态:SHOWVARIABLESLIKESELECT 2、修改scheduler状态为打开(0:off,1:on):SHOWVARIABLESLIKE查看是否开启定时器(OFF:关闭,ON:开启) 3、临时打开定时器(四种方法):a、SETGLOBALeventschedulerON;b、SETglobal。eventschedulerON;c、SETGLOBALeventscheduler1;d、SETglobal。eventscheduler1; 4、永久生效的方法,修改配置文件my。cnfeventscheduler1或者ON 5、临时开启某个事件ALTEREVENTenttestENABLE; 6、临时关闭某个事件ALTEREVENTenttestDISABLE;