围绕唯一数据对 MySQL 表进行分区

用户2044299

我有一个 Mysql 表,其架构如下:

CREATE TABLE `historical_pricing` (
  `date` date DEFAULT NULL,
  `company` varchar(12) DEFAULT NULL,
  `price` double(20,5) DEFAULT NULL,
  `vol` double DEFAULT NULL,
  `id` varchar(25) NOT NULL,
  `created_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP,
  `updated_at` timestamp NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`),
  KEY `date_idx` (`date`),
  KEY `company_idx` (`company`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1

已经加载了大约 12GB 的数据,并且在性能合理的计算机上运行查询以获取不同的代码不会在 15 分钟内完成。

我有几个微服务可以查找:

  • 列出我们拥有数据的所有公司 SELECT distinct(company) from historical_pricing
  • 我们拥有每家公司的所有定价数据 SELECT * FROM historical_pricing where company = 'AAPL' ORDER BY date desc

我通读了 MySQL 5.7 文档,我认为我可以通过1)按公司名称分区和2)为日期设置另一个索引来加快查询速度有一个在MySQL 5.7 8192分区的限制,所以我想使用基于起始名分区:a%b%1%2%,等。

我想弄清楚:

  • 添加分区的正确 MySQL ALTER TABLE 语法是什么?我一直无法弄清楚这是否是列表、范围等。

  • 为 company_date_idx(首先是公司,然后是日期)做一个索引是否有意义,或者 date_idx 是否就足够了,因为索引将在每个分区内创建?

  • 有没有更有效的方法来优化我的查询?

编辑::

我还有另一个索引公司,日期作为多列索引。我注意到,无论如何,每次查找都需要重新运行整个表。如果我应该扩大我的,我运行了以下查询innodb_buffer_pool_size

SELECT engine,
  count(*) as TABLES,
  concat(round(sum(table_rows)/1000000,2),'M') rows,
  concat(round(sum(data_length)/(1024*1024*1024),2),'G') DATA,
  concat(round(sum(index_length)/(1024*1024*1024),2),'G') idx,
  concat(round(sum(data_length+index_length)/(1024*1024*1024),2),'G') total_size,
  round(sum(index_length)/sum(data_length),2) idxfrac
FROM information_schema.TABLES
WHERE table_schema not in ('mysql', 'performance_schema', 'information_schema')
GROUP BY engine
ORDER BY sum(data_length+index_length) DESC LIMIT 10;

结果:

Engine  Table rows data idx total_size idxfrac
InnoDB  9   288.85M 36.28G  58.59G  94.87G  1.61

机器只有3.5GB内存,设置为1GB用于Mysql

里克·詹姆斯
  • 保留股票代码。(是什么??id还是company??)
  • id或 中的另一个company
  • 构建另一个公司表——ticker、company_name 等。这解决了第一个查询的几个数量级。
  • 更改为PRIMARY KEY(ticker, date)This 将比简单地好几个数量级INDEX(ticker, date)为什么?因为第二个查询的所有行都彼此相邻。也就是说,您不会在磁盘上为SELECT *.

但是,你应该停在那里。

缩小数据类型有助于避免昂贵的 I/O...

  • DOUBLE(m,n)不好。我希望他们能摆脱这种语法。它导致两个舍入。要么说,要么DOUBLEDECIMAL.
  • 对于price... 感谢 BRK,您需要在小数点左侧至少保留 6 位数字。由于“便士”或几乎退市的股票,您需要几个小数位。也许DECIMAL(12, 6)会做?这需要 6 个字节(与 8 个相比DOUBLE)。
  • 对于volume... 一些指数基金可以超过40亿,所以INT UNSIGNED是不够的。也许你需要一个 8-byte DOUBLE,或者用 4-byte 失去一些精度FLOAT或者一起去DECIMAL
  • 折腾created_atupdated_at- 它们基本上没用。它们占用 10 个字节。

其他查询呢?特别是,您将每天为每个股票行情添加一个新行??我建议的 PK 会奏效,尽管速度很慢。而且,由于您有整晚的时间来进行插入,所以我们不要添加另一个索引。

如果您有任何其他疑问,那么我们可以考虑PARTITIONs到目前为止,分区只会减慢速度。

不要担心“向后索引扫描”。查询的主要成本是 I/O,我已经解决了这个问题。

请注意您的每个查询现在如何需要触及某些表中的连续行。这与扫描一个巨大的表(您的查询 1)或在索引和数据之间来回移动(查询 2)相反。因此,无论缓存有多“冷”,我的设计对于两个查询都会快得多。

附注。不需要二级索引。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

从具有唯一数据的多个表中排序MySQL SELECT数据

来自分类Dev

MySQL检查唯一数据

来自分类Dev

从表中获取唯一数据

来自分类Dev

SQL - 传输表(?)唯一数据

来自分类Dev

我是否必须删除主键或重新加载表数据以在MySQL InnoDB中进行分区?

来自分类Dev

我是否必须删除主键或重新加载表数据以在MySQL InnoDB中进行分区?

来自分类Dev

mysql计数行中非唯一数据的组合

来自分类Dev

MySQL:2个字段的唯一数据

来自分类Dev

如何计算PHP MySQL中的唯一数据?

来自分类Dev

防止将唯一数据插入表中

来自分类Dev

C#-从SQL表中提取唯一数据

来自分类Dev

计算表中唯一数据的数量

来自分类Dev

通过php文件在表中插入唯一数据

来自分类Dev

从多个表中获取唯一数据

来自分类Dev

MySQL将一个表中的列与另一数据库表中的另一列进行比较

来自分类Dev

按日期对非常大的表进行分区-MySQL

来自分类Dev

MYSQL 使用外键对现有表进行分区

来自分类Dev

如何使用同一数据库表的查询结果更新MYSQL表中的字段?

来自分类Dev

在下拉式PHP mysql中显示唯一数据

来自分类Dev

仅显示列的唯一数据-jQuery数据表

来自分类Dev

创建一个UNION查询,以标识唯一数据来自哪个表

来自分类Dev

创建一个UNION查询,以标识唯一数据来自哪个表

来自分类Dev

如何对从另一个表创建的未分区的配置单元表进行分区

来自分类Dev

根据特定列过滤文本文件中的唯一数据,而不进行排序

来自分类Dev

如何通过查看php中的主键将唯一数据插入其他表

来自分类Dev

字符串拆分后显示两个表之间的唯一数据

来自分类Dev

基于列/ ID的最后一位的MySQL表分区

来自分类Dev

<BR> 1062.使用UPDATE为键“唯一数据”字段重复输入。MySQL数据库

来自分类Dev

在PHP/MYSQL中从同一数据库的两个不同表中选择数据

Related 相关文章

  1. 1

    从具有唯一数据的多个表中排序MySQL SELECT数据

  2. 2

    MySQL检查唯一数据

  3. 3

    从表中获取唯一数据

  4. 4

    SQL - 传输表(?)唯一数据

  5. 5

    我是否必须删除主键或重新加载表数据以在MySQL InnoDB中进行分区?

  6. 6

    我是否必须删除主键或重新加载表数据以在MySQL InnoDB中进行分区?

  7. 7

    mysql计数行中非唯一数据的组合

  8. 8

    MySQL:2个字段的唯一数据

  9. 9

    如何计算PHP MySQL中的唯一数据?

  10. 10

    防止将唯一数据插入表中

  11. 11

    C#-从SQL表中提取唯一数据

  12. 12

    计算表中唯一数据的数量

  13. 13

    通过php文件在表中插入唯一数据

  14. 14

    从多个表中获取唯一数据

  15. 15

    MySQL将一个表中的列与另一数据库表中的另一列进行比较

  16. 16

    按日期对非常大的表进行分区-MySQL

  17. 17

    MYSQL 使用外键对现有表进行分区

  18. 18

    如何使用同一数据库表的查询结果更新MYSQL表中的字段?

  19. 19

    在下拉式PHP mysql中显示唯一数据

  20. 20

    仅显示列的唯一数据-jQuery数据表

  21. 21

    创建一个UNION查询,以标识唯一数据来自哪个表

  22. 22

    创建一个UNION查询,以标识唯一数据来自哪个表

  23. 23

    如何对从另一个表创建的未分区的配置单元表进行分区

  24. 24

    根据特定列过滤文本文件中的唯一数据,而不进行排序

  25. 25

    如何通过查看php中的主键将唯一数据插入其他表

  26. 26

    字符串拆分后显示两个表之间的唯一数据

  27. 27

    基于列/ ID的最后一位的MySQL表分区

  28. 28

    <BR> 1062.使用UPDATE为键“唯一数据”字段重复输入。MySQL数据库

  29. 29

    在PHP/MYSQL中从同一数据库的两个不同表中选择数据

热门标签

归档