...尝试优化 mysql innodb 表以实现快速计数仍然没有得到结果

Posted

技术标签:

【中文标题】...尝试优化 mysql innodb 表以实现快速计数仍然没有得到结果【英文标题】:...still not getting results trying to optimize mysql innodb table for fast count 【发布时间】:2012-01-06 13:12:33 【问题描述】:

我不久前发布了这个问题here。我尝试了这些建议并得出结论,我一定是在做一些根本错误的事情。 我基本上想做的是:

我有一个包含 83Mio 的表。时间/价格对。由于索引 im 使用毫秒精确的 unix 时间戳,价格范围在 1.18775 和 1.60400 之间(精度为 5 的十进制)。 我有一个客户需要在给定的时间间隔内获取价格密度,这意味着我想采用指定的时间间隔并计算所有不同价格在此间隔内出现的次数。 你们会怎么做呢?您将如何设计/索引该表?现在我正在构建一个临时子表,其中仅包含给定间隔的数据,然后对价格进行计数。有一个更好的方法吗?我的一般数据库设置已经调出并且性能非常好。感谢您的任何提示!我会尽快提供所需的任何其他信息!

【问题讨论】:

【参考方案1】:

鉴于您拥有大量数据且数据增长迅速,我倾向于添加第二个表:

price (primary key)
time( some block - also part of PK )
count

做一个“插入重复键更新计数++”之类的事情。按某个预定间隔对时间字段进行分组(取决于您获得的查询类型.. ms/sec/hour/whatever)。这样你:

 don't have to mess with temp tables - with a table of this size it will write to disk - slow even with SSD
 don't have to touch the initial table every time you want to do your query - might run into locking issues

您必须对数据进行一点平均,但可以预先确定粒度以尽可能减少问题。

【讨论】:

感谢您的回答,我不确定我是否正确。我想尽量避免为我的表使用预定间隔,因为时间间隔是由 procedure3 调用动态分配的。 我想这就是我所说的——你可以通过一些时间块来避免你的数据库上的大量开销。 IE 强制为此查询设置某种最小间隔。当您查看图表时,结果将是相同的。

以上是关于...尝试优化 mysql innodb 表以实现快速计数仍然没有得到结果的主要内容,如果未能解决你的问题,请参考以下文章

mysql优化

tinyint 列优化 mysql

如何优化 1Gb 大小 250k+ 行的 Mysql 表以获得更好的性能

Mysql优化系列--Innodb引擎下mysql自身配置优化

Mysql优化系列--Innodb引擎下mysql自身配置优化

「mysql优化专题」详解引擎(InnoDB,MyISAM)的内存优化攻略?