在这种情况下,MyISAM在mysql中比InnoDB快得多。

9 浏览
0 Comments

在这种情况下,MyISAM在mysql中比InnoDB快得多。

我一直在为一个在InnoDB表中计算客户之间距离的算法编写结果。例如,如果我的客户是A、B、C和D,数据库中的表如下所示,还有其他列:

From | To    | Distance
  A     B        344
  A     C        274
  A     D        182
  B     C        338

等等...我认为有很多行,可能会达到5000万行。

其他列是product_type和value。它们告诉我客户B(在列中的customer_to)购买了多少该product_type的商品。这意味着根据客户B购买的product_type数量,我将每对数据重复多次。

我需要进行一个查询,将每个客户与其邻居购买的商品和价值进行分组。查询如下所示:

select customer_from, product_type, avg(value) as opportunity
from customer_distances
where distance < 500
group by customer_from, product_type
order by opportunity desc; 

InnoDB表无法回答我这个查询。尽管我将net_read_timeout更改为28800,但在查询过程中,mysql连接丢失了。

我认为这可能与InnoDB用于事务处理而不是用于密集查询有关。所以我创建了一个新的MyISAM引擎的表,并将所有记录从InnoDB表插入到其中。

正如预期的那样,选择非常快(70秒),而所有其他选择,如count(distinct customer_from),几乎是瞬间的。

只是出于好奇,我尝试继续将距离插入到MyISAM表中。当程序开始运行时,它以至少比在InnoDB表上运行时快100倍的速度运行-对于插入!

对于每个客户,程序会插入大约3000行数据(每个邻居和每个product_type一个)。每个客户约有300个邻居和10个product_type。使用InnoDB表,插入一个客户需要大约40到60秒(大约3000行)。使用MyISAM表,插入3个客户只需要1秒钟(约9000行)。

一些额外的信息:

  • mysql数据库在我的个人电脑上(localhost)。
  • 程序使用java编写,并在我的个人电脑上运行。
  • 我使用预处理语句,只在每行与下一行之间更改数据。这与这个问题有关:为什么MyISAM存储引擎比InnoDB存储引擎更快

所以总结一下问题是:

为什么使用插入语句时MyISAM如此快?

你有什么想法吗?

编辑1:我添加了两个表的create语句,InnoDB和MyISAM。

编辑2:我删除了一些无用的信息,并进行了一些格式调整。

0
0 Comments

在这种情况下,MyISAM在mysql中比InnoDB快得多的原因是什么?通过分析上述内容,可以得出以下原因和解决方法。

问题的原因:

1. Inserts:InnoDB默认情况下会立即提交每个INSERT操作,这会导致性能下降。可以通过将100-1000行数据分批插入来解决这个问题。

2. Select:InnoDB比MyISAM占用更多的磁盘空间,通常是2倍至3倍,这会影响表扫描的性能。

3. Tuning:在仅运行MyISAM时,将key_buffer_size设置为RAM的20%,将innodb_buffer_pool_size设置为0。在仅运行InnoDB时,将key_buffer_size设置为仅有10M,将innodb_buffer_pool_size设置为RAM的70%。

4. Normalization and saving space:通过规范化和节省空间来提高性能,如减小数据类型长度、合并重复列等。

问题的解决方法:

1. Inserts:将INSERT操作分批处理,可以使用autocommit和BEGIN..COMMIT来控制提交。

2. Select:创建一个包含(customer_from, product_type, distance)的复合索引,可以提高两种引擎的性能。

3. Tuning:根据运行的引擎类型,调整key_buffer_size和innodb_buffer_pool_size的大小。

4. Normalization and saving space:通过规范化数据和减小数据类型长度来节省空间,并提高缓存效果和减少I/O操作。

通过以上的优化和调整,这个包含5000万行的表将会变得更小,并在两种引擎中运行得更快。接下来可以进行性能比较来验证结果。

谢谢你的答案。我将进行这些更改并在此记录结果。

- 有结果了吗?

0