2012-03-12 31 views
0

我有一个包含IP范围的3,000,000行的表格及其相应的国家,地区(省)和城市。该表在MyISAM引擎中。MySQL:从MyISAM转换到InnoDB使查询更快......?

我写了一个脚本,通过IP为用户提取地理位置,其中一些查询花费了17秒。然后,我将该表转换为InnoDB,并重新尝试查询过程,一些已知费时的问题查询在性能方面显着提高,最短只需0.02秒。尽管仍然有查询需要2到3秒才能完成,但查找大约1000个IP地址所花费的时间大约是以前在MyISAM引擎上运行时间的一半。

我在网上做了一个比较MyISAM和InnoDB的搜索,但是所有我读过的文章都认为MyISAM在SELECT查询上比InnoDB快。但是,根据我所看到的,我的桌子不是这种情况。有没有人有任何理论为什么?我的表没有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

您是否比较了两个引擎的缓存/密钥大小? InnoDB可以被允许比MyISAM更高的限制。 – 2012-03-12 16:43:48

+0

@MarcB那么你是在谈论MySQL放入缓存以便快速访问的数据大小? – 2012-03-12 17:06:16

+0

是的,mysql中的每个引擎都可以拥有自己的缓存/缓存/限制,独立于其他引擎。 innodb通常比myisam稍慢,但是如果inno得到(比如说)2x的缓冲区空间,那么这会掩盖放缓并出来更快可能 – 2012-03-12 23:15:02

回答

2

检查两种发动机的配置。您的InnoDB引擎的配置可能比您设置MyISAM的方式更有效。

关键配置值是innodb_buffer_pool_size,InnoDB缓存数据(和索引,但没有任何索引)。

+0

感谢您的答复,我检查了变量和“innodb_buffer_ppol_size”和“key_buffer_size “ 是相同的。 – 2012-03-12 18:49:50

+0

我将查询改为“SELECT country,region,city FROM ip_location WHERE ip_start <= 1177798832 ORDER BY ip_start ASC LIMIT 1”,它产生相同的结果,但幅度更快(0.001s)...不知道这是为什么的情况下,但谢谢你反正!我会把它作为接受,因为你的是唯一的答复大声笑 – 2012-03-13 15:37:11

+0

@Xavier_Ex:非常感谢 - 我欣赏它。要理解MySQL如何解释您的查询,请在其上使用EXPLAIN。例如,您将不得不学习一些内部函数来欣赏您获得的报告,但您会明白为什么订单比两个不同值的比较要快得多。 – 2012-03-13 21:55:22

2

我发现a good article about InnoDB vs MyISAM,说这个关于性能:

聚集主键的这种技术原因在MyISAM和InnoDB之间的基准还算 大比分时,其中一个 查询有关使用主一个范围的关键。 尽管如此,令人惊讶的是InnoDB仍然在使用二级索引的测试中获胜。这是令人欣慰的,因为它表明引擎的性能 不仅仅基于密钥集群,性能提升 非常依赖于查询。

InnoDB也对索引使用了其他一些技巧。 它可以为频繁查询构建 “自适应散列索引”,并在整个表接近拟合内存时执行此操作[5]。这些散列索引 比标准BTree索引(当表 在内存中时)快很多。同样,这是另一项重要的性能改进,其代价是内存使用量。

你的表听起来相当大的,所以我怀疑它是被全部保存在内存,但它听起来像是InnoDB的处理指标比MyISAM的更好,无论如何,加上因为你是如此的具体,可高速缓存的结果查询。