MySQL表分区解决数据量过多导致查询缓慢的问题

MySQL :当表数据量每天有数据更新,数据量特别大的情况下,将选择mySQL的表分区

---------------------- //第一步,建分区表时,对数据库操作,修正group by的错误
show variables like “sql_mode”;

set sql_mode=’’;
set sql_mode=‘NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES’;

------------------------ 查看分区
SELECT * FROM information_schema. PARTITIONS t
WHERE t.PARTITION_NAME IS NOT NULL;

----------------------- 删除分区,恢复原表
alter table indicator_history remove partitioning;

-----------------------建立分区,需要分区的主表如果存在id主键,那么分区时间字段也应设置为第二主键
ALTER TABLE indicator_history PARTITION BY RANGE (UNIX_TIMESTAMP(create_time))
(
PARTITION p20181201 VALUES LESS THAN (UNIX_TIMESTAMP(‘2018-11-21 00:00:00’)),
PARTITION p20181201 VALUES LESS THAN (UNIX_TIMESTAMP(‘2018-11-22 00:00:00’)),
PARTITION p20181201 VALUES LESS THAN (UNIX_TIMESTAMP(‘2018-11-23 00:00:00’)),
PARTITION p20181201 VALUES LESS THAN (UNIX_TIMESTAMP(‘2018-11-24 00:00:00’)),
PARTITION p20181201 VALUES LESS THAN (UNIX_TIMESTAMP(‘2018-11-25 00:00:00’)),
PARTITION p20181201 VALUES LESS THAN (UNIX_TIMESTAMP(‘2018-11-26 00:00:00’)),
PARTITION p20181201 VALUES LESS THAN (UNIX_TIMESTAMP(‘2018-11-27 00:00:00’)),
PARTITION p20181201 VALUES LESS THAN (UNIX_TIMESTAMP(‘2018-11-28 00:00:00’)),
PARTITION p20181201 VALUES LESS THAN (UNIX_TIMESTAMP(‘2018-11-29 00:00:00’)),
PARTITION p20181201 VALUES LESS THAN (UNIX_TIMESTAMP(‘2018-11-30 00:00:00’)),
PARTITION p20181201 VALUES LESS THAN (UNIX_TIMESTAMP(‘2018-12-01 00:00:00’)),
PARTITION p20181202 VALUES LESS THAN (UNIX_TIMESTAMP(‘2018-12-02 00:00:00’)),
PARTITION p20181203 VALUES LESS THAN (UNIX_TIMESTAMP(‘2018-12-03 00:00:00’)),
PARTITION p20181204 VALUES LESS THAN (UNIX_TIMESTAMP(‘2018-12-04 00:00:00’)),
PARTITION p20181205 VALUES LESS THAN (UNIX_TIMESTAMP(‘2018-12-05 00:00:00’)),
PARTITION p20181206 VALUES LESS THAN (UNIX_TIMESTAMP(‘2018-12-06 00:00:00’)),
PARTITION p20181207 VALUES LESS THAN (UNIX_TIMESTAMP(‘2018-12-07 00:00:00’))
);

--------------------------------建立存储函数
DELIMITER $$

DROP PROCEDURE IF EXISTS create_Partition_History;

CREATE PROCEDURE create_Partition_History()
BEGIN
DECLARE p_id int;
DECLARE nextDate date;
DECLARE lastDate LONG;
SELECT COUNT(partition_name) into p_id FROM INFORMATION_SCHEMA.partitions
WHERE TABLE_SCHEMA = SCHEMA() AND TABLE_NAME= ‘indicator_history’;

	SELECT max(partition_description) into lastDate  from INFORMATION_SCHEMA.partitions
            WHERE TABLE_SCHEMA = SCHEMA() AND TABLE_NAME='indicator_history';
    select DATE_ADD(FROM_UNIXTIME(lastDate),INTERVAL 1 DAY)  into nextDate  from dual;
    set @v_add=CONCAT('alter table indicator_history add partition (partition ',CONCAT('par',p_id),
                    ' values less than (UNIX_TIMESTAMP(\'',nextDate,'\')))');

PREPARE stmt from @v_add;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
	COMMIT;

END

-----------------------------建立触发事件
DELIMITER ||
CREATE EVENT indicator_history_event
ON SCHEDULE
EVERY 1 day STARTS ‘2018-12-06 23:59:00’
DO
BEGIN

       CALL `create_Partition_History`;

END ||
DELIMITER ;

------------------查看event是否开启
show variables like ‘%sche%’

---------------------将事件计划开启,全局事件调度开关,1为开0为关
set global event_scheduler=1;

-----------------------------开启事件任务
alter event indicator_history_event on completion preserve enable;

-----------------------------关闭事件任务
alter event indicator_history_event on completion preserve disable;

你可能感兴趣的:(MySQL表分区解决数据量过多导致查询缓慢的问题)