mysql - 分区将如何影响我当前在 MySQL 中的查询?什么时候对我的表进行分区?

标签 mysql partitioning

我有一个包含 150 万行、39 列的表,其中包含大约 2 年的销售数据,并且每天都在增长。 在我们将它移到新服务器之前我没有遇到任何问题,我们现在的内存可能更少了。

查询目前需要很长时间。有人建议对导致大部分性能问题的大表进行分区,但我有几个问题。

  1. 对我描述的表进行分区是否明智? 可能提高其性能?
  2. 如果我对它进行分区,将会 我必须更改我当前的 INSERT 或 SELECT 语句或 他们会继续以同样的方式工作吗?
  3. 是否分区 需要很长时间才能执行?我担心性能缓慢, 中途会发生一些事情,我会丢失数据。

  4. 我应该将它分成几年还是几个月? (我们通常 查看一个月内的数字,但有时我们需要数周或 年)。我还应该对列进行分区吗? (我们有一些 我们很少或从不使用的列,但我们可能想使用它们 稍后)

最佳答案

(我同意 Bill 的回答;我将以不同的方式处理这个问题。)

When is it time to partion my tables?

可能永远不会。

is it likely to improve its performance?

更有可能稍微降低性能。

I have a table that contains 1.5 million rows

不够大,无法进行分区。

Queries are currently taking a very long time

通常这是由于缺少一个好的索引,可能是一个“复合”索引。 其次是查询的表述。请向我们展示一个慢查询,以及 SHOW CREATE TABLE

data of around 2 years, and grows every day

您最终会清除“旧”数据吗?如果是这样,PARTITION BY RANGE(TO_DAYS(..)) 是个好主意。但是,它仅在清除期间有帮助。这是因为DROP PARTITIONDELETE...很多

we probably have less memory now.

如果您主要查看“最新”数据,那么内存大小 (cf innodb_buffer_pool_size)可能无关紧要。这是由于缓存。但是,这听起来像是您在进行表扫描,也许是不必要的。

will I have to make changes to my current INSERT or SELECT

没有。但是您可能需要更改PRIMARY KEY 和辅助键中的列。

Does the partition take a long time to perform?

慢 - 是的,因为它会复制整个表格。注意:这意味着额外的磁盘空间,分区表将占用更多磁盘空间。

something would happen midway through and I would lose the data.

别担心。新表已创建,然后非常快速的 RENAME TABLE 将其交换到位。

Should I be partioning it to years or months?

经验法则:目标是大约 50 个分区。对于“2 年且不断增长”,一个可能的选择是“每月”。

we usually look at the numbers within the month, but sometimes we take weeks or years

闻起来像典型的“数据仓库”数据集?使用每日统计信息构建并逐步扩充“汇总表”。使用该表,您可以快速获得每周/每月/每年的统计数据——速度可能快 10 倍。适用于任何日期范围。这也对“低内存”有很大帮助。

And should I also partition the columns? (We have some columns that we rarely or never use, but we might want to use them later)

你应该“永远”使用SELECT *;相反,请指定您实际需要的列。 “垂直分区”是您建议的术语。它有时很实用。但我们需要查看 SHOW CREATE TABLE 具有实际列名 以进一步讨论。

关于分区的更多信息:http://mysql.rjweb.org/doc.php/partitionmaint
有关汇总表的更多信息:http://mysql.rjweb.org/doc.php/summarytables

关于mysql - 分区将如何影响我当前在 MySQL 中的查询?什么时候对我的表进行分区?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55424475/

相关文章:

mysql - 如何同时更新Redis和MySQL中的数据?

python - 无法将数据插入数据库,但每次运行它都会返回成功

mysql - 如何从两个相关表中获取数据?

algorithm - 用于并行处理的分区二叉树的 "m-bridge technique"是什么?

performance - 在什么情况下散列分区优先于 Spark 中的范围分区?

mysql - 优化大 MySQL 表的搜索

mysql - sql多对多关系只有2个表

php - Doctrine DBAL 如果不存在则插入

mysql - 将 MySQL 表中的分区添加到已分区的表中

file - Spark 分区/集群执行