mysql 数据量大,使用月分区,加快速度大数据查询

本文的原文连接是: http://blog.csdn.net/freewebsys/article/details/78624090
未经博主允许不得转载。
博主地址是:http://blog.csdn.net/freewebsys

1,关于mysql 分区


https://dev.mysql.com/doc/refman/5.7/en/partitioning-overview.html
mysql 分区也是一个强大的功能。
一般情况下,大家都想着做数据库分表。直接用下划线命名。
其实在mysql 当中可以直接使用分区表。进行底层的数据拆分。
让数据访问的速度更快。

2,举个股票数据的栗子


股票的每天的交易数据都是很大的,所以需要讲数据库表按月,或者按季度进行拆分。

--创建 分区表。每月的分区小于下个月 1号的日期。
CREATE TABLE `stat_stock_all` (
  `date` date NOT NULL,
  `code` varchar(255) NOT NULL,
  `name` varchar(255) DEFAULT NULL,
  `change` varchar(255) DEFAULT NULL,
  `open` varchar(255) DEFAULT NULL,
  `preclose` varchar(255) DEFAULT NULL,
  `close` varchar(255) DEFAULT NULL,
  `high` varchar(255) DEFAULT NULL,
  `low` varchar(255) DEFAULT NULL,
  `volume` varchar(255) DEFAULT NULL,
  `amount` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`date`,`code`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8
PARTITION BY RANGE(TO_DAYS(`date`))
(
  PARTITION p201612 VALUES LESS THAN (TO_DAYS('2017-01-01')),
  PARTITION p201701 VALUES LESS THAN (TO_DAYS('2017-02-01')),
  PARTITION p201702 VALUES LESS THAN (TO_DAYS('2017-03-01')),
  PARTITION p201703 VALUES LESS THAN (TO_DAYS('2017-04-01')),
  PARTITION p201704 VALUES LESS THAN (TO_DAYS('2017-05-01')),
  PARTITION p201705 VALUES LESS THAN (TO_DAYS('2017-06-01')),
  PARTITION p201706 VALUES LESS THAN (TO_DAYS('2017-07-01')),
  PARTITION p201707 VALUES LESS THAN (TO_DAYS('2017-08-01')),
  PARTITION p201708 VALUES LESS THAN (TO_DAYS('2017-09-01')),
  PARTITION p201709 VALUES LESS THAN (TO_DAYS('2017-10-01')),
  PARTITION p201710 VALUES LESS THAN (TO_DAYS('2017-11-01')),
  PARTITION p201711 VALUES LESS THAN (TO_DAYS('2017-12-01'))
);

参考:
https://dev.mysql.com/doc/refman/5.6/en/partitioning-management-range-list.html

说明,按月拆分的时候,需要指定,date字段 less 小于下个月1 号。才是这个月的数据。
需要使用 to_days 函数,要是按季度拆分的话如下:

CREATE TABLE `stat_stock_all` (
  `date` date NOT NULL,
  `code` varchar(255) NOT NULL,
  `name` varchar(255) DEFAULT NULL,
  `change` varchar(255) DEFAULT NULL,
  `open` varchar(255) DEFAULT NULL,
  `preclose` varchar(255) DEFAULT NULL,
  `close` varchar(255) DEFAULT NULL,
  `high` varchar(255) DEFAULT NULL,
  `low` varchar(255) DEFAULT NULL,
  `volume` varchar(255) DEFAULT NULL,
  `amount` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`date`,`code`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8
PARTITION BY RANGE(TO_DAYS(`date`))
(
  PARTITION p2017q1 VALUES LESS THAN (TO_DAYS('2017-04-01')),
  PARTITION p2017q2 VALUES LESS THAN (TO_DAYS('2017-07-01')),
  PARTITION p2017q3 VALUES LESS THAN (TO_DAYS('2017-10-01')),
  PARTITION p2017q4 VALUES LESS THAN (TO_DAYS('2018-01-01')),

  PARTITION p2018q1 VALUES LESS THAN (TO_DAYS('2018-04-01')),
  PARTITION p2018q2 VALUES LESS THAN (TO_DAYS('2018-07-01')),
  PARTITION p2018q3 VALUES LESS THAN (TO_DAYS('2018-10-01')),
  PARTITION p2018q4 VALUES LESS THAN (TO_DAYS('2019-01-01')),

  PARTITION p2019q1 VALUES LESS THAN (TO_DAYS('2019-04-01')),
  PARTITION p2019q2 VALUES LESS THAN (TO_DAYS('2019-07-01')),
  PARTITION p2019q3 VALUES LESS THAN (TO_DAYS('2019-10-01')),
  PARTITION p2019q4 VALUES LESS THAN (TO_DAYS('2020-01-01')),

  PARTITION p2020q1 VALUES LESS THAN (TO_DAYS('2020-04-01')),
  PARTITION p2020q2 VALUES LESS THAN (TO_DAYS('2020-07-01')),
  PARTITION p2020q3 VALUES LESS THAN (TO_DAYS('2020-10-01')),
  PARTITION p2020q4 VALUES LESS THAN (TO_DAYS('2021-01-01')),

  PARTITION p2021q1 VALUES LESS THAN (TO_DAYS('2021-04-01')),
  PARTITION p2021q2 VALUES LESS THAN (TO_DAYS('2021-07-01')),
  PARTITION p2021q3 VALUES LESS THAN (TO_DAYS('2021-10-01')),
  PARTITION p2021q4 VALUES LESS THAN (TO_DAYS('2022-01-01')),

  PARTITION p2022q1 VALUES LESS THAN (TO_DAYS('2022-04-01')),
  PARTITION p2022q2 VALUES LESS THAN (TO_DAYS('2022-07-01')),
  PARTITION p2022q3 VALUES LESS THAN (TO_DAYS('2022-10-01')),
  PARTITION p2022q4 VALUES LESS THAN (TO_DAYS('2023-01-01'))
);

https://dev.mysql.com/doc/refman/5.7/en/partitioning-management-range-list.html
特别说明:
mysql 有 year 函数,但是没有 to_month 函数,造成不能直接获得年+月这样的数据。
只能使用 TO_DAYS 这样的函数进行折中的使用了。
只要是 能range 到一个数据就行了。实际使用当中,可以提前把几年的数据分区都做了。
这样的话查询速度就快多了。

3,分区删除,增加,查询


--删除一个表的分区。
ALTER TABLE stat_stock_all DROP PARTITION p201612;

--增加一个表分区。
ALTER TABLE stat_stock_all ADD PARTITION (PARTITION p201712 VALUES LESS THAN (TO_DAYS('2018-01-01')));

--直接按照分区查询查询全部表分区数据
SELECT * FROM stat_stock_all PARTITION (p201711,p201710);

--查询分区信息
SELECT DISTINCT *
 FROM INFORMATION_SCHEMA.PARTITIONS
  WHERE TABLE_NAME='stat_stock_all'

展示分区表查询结果:

可以详细的看到分区的列。查询的时候直接输入所在分区。

EXPLAIN PARTITIONS SELECT * FROM stat_stock_all PARTITION (p201711,p201710);

分析是否命中分区查询

4,总结


mysql 的分区表非常方便的使用,可以通过最简单的方式解决数据的问题。
基本上按照月进行拆分就可以了。如果数据量更大的话。再按照每月 上中下旬进行拆分。
实在不行,就分库优化了。

本文的原文连接是: http://blog.csdn.net/freewebsys/article/details/78624090
未经博主允许不得转载。
博主地址是:http://blog.csdn.net/freewebsys

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MySQL数据库中的数据量增加时,查询速度可能会变慢。这是因为MySQL需要扫描更多的数据行或者进行更多的磁盘IO操作来获取匹配的结果。以下是一些可行的解决方案来提高查询速度: 1. 索引优化:确保表中的列使用适当的索引。使用索引可以减少数据扫描的数量,从而加快查询速度。通过分析查询语句和表结构,确定是否需要添加、修改或删除索引。 2. 分区表:将大表分解为多个较小的分区表。这样可以将数据分布在不同的物理位置上,减少查询时需要扫描的数据量。 3. 查询优化:优化查询语句,避免全表扫描和不必要的连接操作。使用合适的查询条件、避免使用通配符查询使用查询等方式来改进查询性能。 4. 缓存机制:使用数据库缓存(如MySQL查询缓存)来缓存常用的查询结果,减少数据库访问次数。 5. 硬件升级:增加服务器的内存、CPU和磁盘等硬件资源,提高数据库处理能力。 6. 数据归档和清理:对于不再需要的历史数据,可以考虑进行数据归档和清理,以减少数据库的数据量。 7. 数据库参数调优:根据实际情况调整MySQL的配置参数,如增大缓冲区大小、调整并发连接数等,以优化数据库的性能。 需要根据具体情况进行分析和调整,可以使用MySQL提供的性能分析工具(如Explain、Slow Query Log等)来帮助定位慢查询问题,并采取相应的优化措施。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值