mysql分区表分离_在mysql中分区或分离一个非常大的表

我们在

mysql中有一个非常大的表,其中包含500,000,000条记录,每秒有100个请求(SELECT).

这是架构:

id(int),

user_id (int),

content(text),

date(datetime)

由于高达90%的请求是在过去6个月内.我的问题是提高绩效.

将这些记录与另一个表中的过去6个月分开并从中分离出来是一个好主意,或者使用分区方法快速获取过去6个月的所有记录.

或者,如果有更好的方法……

例如,查询是这样的.

SELECT content,user_id FROM log

JOIN users ON users.id = log.user_id

WHERE date > DATE_SUB(CURDATE(), INTERVAL 180 DAY)

LIMIT 15

user_id,日期在表Log中建立索引

表用户中有200万用户.

最佳答案 您的编辑说您以每小时三分之一的速度使用此类查询.

SELECT content,user_id

FROM log

JOIN users ON users.id = log.user_id

WHERE date > DATE_SUB(CURDATE(), INTERVAL 180 DAY)

LIMIT 15

我将冒昧地重写此查询以完全限定列选择.

SELECT log.content,

log.user_id

FROM log /* one half gigarow table */

JOIN users ON users.id = log.user_id /* two megarow table */

WHERE log.date > DATE_SUB(CURDATE(), INTERVAL 180 DAY)

LIMIT 15

(如果不正确,请考虑更新您的问题.)

为什么要加入此查询中的users表?你的结果似乎都不是来自它.为什么这个查询不能满足您的需求?

SELECT log.content,

log.user_id

FROM log /* one half gigarow table */

WHERE log.date > DATE_SUB(CURDATE(), INTERVAL 180 DAY)

LIMIT 15

如果要更快地进行此查询,请在(date,user_id,content)上放置一个覆盖索引的化合物.该覆盖索引将支持范围扫描和快速检索.如果您的内容列实际上是TEXT(LOB)类型,则需要将(date,user_id)放入覆盖索引中,并且检索速度会慢一些.

您是否使用JOIN来确保返回的用户具有匹配条目的日志条目?如果是这样,请更好地解释您的查询.

您绝对可以根据日期范围对表进行分区.但是你需要改变你的桌子,或者重新创建并重新填充它,这将导致停机或巨大的争夺.

像这样的DDL应该为你做的伎俩

CREATE TABLE LOG (

id INT NOT NULL AUTO_INCREMENT, /*maybe BIGINT? */

user_id INT NOT NULL,

`date` DATETIME NOT NULL,

content TEXT,

UNIQUE KEY (id, `date`),

KEY covering (`date`,user_id)

)

PARTITION BY RANGE COLUMNS(`date`) (

PARTITION p0 VALUES LESS THAN ('2012-01-01'),

PARTITION p1 VALUES LESS THAN ('2012-07-01'),

PARTITION p2 VALUES LESS THAN ('2013-01-01'),

PARTITION p3 VALUES LESS THAN ('2013-07-01'),

PARTITION p4 VALUES LESS THAN ('2014-01-01'),

PARTITION p5 VALUES LESS THAN ('2014-07-01'),

PARTITION p6 VALUES LESS THAN ('2015-01-01'),

PARTITION p7 VALUES LESS THAN ('2015-07-01')

);

请注意,有关于UNIQUE KEY的一些猴子业务.进入分区功能的列也需要出现在所谓的主键中.

稍后,当2015年7月(分区p7的截止日期)接近时,您可以运行此语句为下一个六个月的时间段添加分区.

ALTER TABLE `log`

ADD PARTITION (PARTITION p8 VALUES LESS THAN ('2016-01-01'))

但是,严重的是,如果您的查询有不必要的连接或索引覆盖率差,这个分区垃圾都不会有太大帮助.它将使您的数据库管理更加复杂.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值