我有一个包含 150 万行、39 列的表,其中包含大约 2 年的销售数据,并且每天都在增长。 在我们将它移到新服务器之前我没有遇到任何问题,我们现在的内存可能更少了。
查询目前需要很长时间。有人建议对导致大部分性能问题的大表进行分区,但我有几个问题。
- 对我描述的表进行分区是否明智? 可能提高其性能?
- 如果我对它进行分区,将会 我必须更改我当前的 INSERT 或 SELECT 语句或 他们会继续以同样的方式工作吗?
是否分区 需要很长时间才能执行?我担心性能缓慢, 中途会发生一些事情,我会丢失数据。
我应该将它分成几年还是几个月? (我们通常 查看一个月内的数字,但有时我们需要数周或 年)。我还应该对列进行分区吗? (我们有一些 我们很少或从不使用的列,但我们可能想使用它们 稍后)
最佳答案
(我同意 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 PARTITION
比DELETE...
快很多。
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/