我有一张包含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;
答案 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更好地处理索引,而且因为你是如此具体,它可能会缓存查询的结果。