MySQL:从MyISAM转换到InnoDB使查询更快......?

时间:2012-03-12 16:39:21

标签: mysql innodb myisam

我有一张包含3,000,000行的表,其中包含IP范围及其对应的国家,地区(省)和城市。该表位于MyISAM引擎中。

我编写了一个脚本,用于通过IP获取用户的地理位置,一些查询占用时间长达17秒。然后我将表转换为InnoDB并重新查询查询过程,一些有问题的查询已经耗费时间,性能显着提高,耗时短至0.02秒。虽然仍然需要2到3秒才能完成查询,但在MyISAM引擎上运行时,查看大约1000个IP地址所花费的时间大约是以前的一半。

我在线搜索了MyISAM和InnoDB,但我读到的所有文章都认为MyISAM在SELECT查询上比InnoDB快。但是,据我所见,这不是我桌子的情况。有没有人有任何理论原因?

P.S,我的表没有FK约束,没有PK,通过比较IP与每行的'ip_start'和'ip_end'列来完成查找。如果IP在范围内,则该行将匹配。以下是我脚本中的示例查询:

SELECT country, region, city FROM ip_location WHERE ip_start<=1177798832 AND ip_end>=1177798832 LIMIT 1;

2 个答案:

答案 0 :(得分:2)

检查两个引擎的配置。与您设置MyISAM的方式相比,InnoDB引擎的配置可能对您的搜索更有效。

密钥配置值是innodb_buffer_pool_size,这是InnoDB缓存数据(和索引,但您没有任何索引)的地方。

答案 1 :(得分:2)

我发现a good article about InnoDB vs MyISAM说的是性能:

  

这种群集主键技术是公平的原因之一   在MyISAM和InnoDB之间的基准测试中有很大的差距   有问题的查询使用范围的主键。 有点什么   但令人惊讶的是,InnoDB仍然在使用a的测试中获胜   二级指数。这表示性能令人欣慰   引擎不仅仅基于密钥集群,还有性能提升   这非常依赖于查询。

     

InnoDB也使用其他一些带索引的技巧。 它可以构建   用于频繁查询的“自适应哈希索引”,并在执行时进行   整张桌子接近于记忆。[5]这些哈希索引   比标准BTree索引快得多(当表格时)   在内存中。再次,这是另一个重要的表现   以内存使用为代价进行改进。

你的表听起来相当大,所以我怀疑它是完全保留在内存中的,但听起来InnoDB无论如何都比MyISAM更好地处理索引,而且因为你是如此具体,它可能会缓存查询的结果。