2010-10-02 70 views
1

慢得多我有一个非规范化表product有大约6万行(〜2GB)主要用于查找。字段包括price, color, unitprice, weight, ...MySQL集群比InnoDB的

我有color等查询条件被从Web动态生成BTREE索引,如

select count(*) 
from product 
where color = 1 and price > 5 and price < 100 and weight > 30 ... etc 

select * 
from product 
where color = 2 and price > 35 and unitprice < 110 
order by weight 
limit 25; 

我曾经使用InnoDB和试图MEMORY表,并切换到NDB希望更多的并发查询可以更快地完成。我有两个具有相同架构,索引和数据的表。一个是InnoDB,另一个是NDB。但结果非常令人失望:对于上面提到的查询,InnoDB比NDB快50倍。这就像0.8 seocond vs 40秒。对于这个测试,我反复运行一个选择查询。 InnoDB和NDB查询都使用color上的相同索引。

我在双Xeon 5506(总共8个内核),运行CentOS 5的32GB内存上使用了mysql-5.1.47 ndb-7.1.5。我设置了2个NDB数据节点,一个MGM节点和一个MYSQL节点同一个盒子。对于我分配的每个节点,如9GB内存,也尝试MaxNoOfExecutionThreads=8, LockPagesInMainMemory, LockExecuteThreadToCPU和许多其他配置参数,但没有运气。当NDB运行查询时,我的峰值CPU负载仅为200%,即8个内核中只有2个处于忙碌状态。大部分时间它都是100%。我正在使用ndbmtd,并在数据节点日志中进行了验证,并且确实生成了LQH线程。 我也试过解释,分析 - 它只是显示Sending data大部分时间都在消耗。我也通过网上提供的一些Mysql Cluster调优文档,在我的情况下不是很有帮助。

任何人都可以在此提供一些线索?有没有更好的方法来调整NDB数据库?欣赏它!

+0

问题应该是“MySQL Cluster比Innodb慢得多”? – Martin 2010-10-02 19:58:12

+0

你的表上定义了哪些索引? – Martin 2010-10-02 20:00:28

+0

innodb和ndb中使用的索引是相同的,'color'是int(11)类型。 – 2010-10-03 01:42:21

回答

3

您需要为您的应用程序选择正确的存储引擎。

的MyISAM - 频繁的读/写很少。适用于大型表格中的数据查询。对于复杂的索引是否合理,对于批量重新加载非常有用。

记忆 - 有利于快速访问相对小而简单的表。

InnoDB - 适用于事务处理。也适用于混合读/写工作负载。

NDB - 相对不太成熟。有利于容错。

MySQL服务器是不是天生的多处理器的软件。因此添加内核并不一定会提升性能。一个好的mySQL主机是一个体面的双核系统,具有大量的RAM和最快的磁盘IO通道和磁盘,你可以负担得起。除非您不关心查询性能,否则不要将您的mySQL数据文件放在联网或共享文件系统上。

如果你在Linux上运行的问题,这两个命令(运行MySQL服务器的计算机上),看看是否你燃烧你所有的CPU,或燃烧所有的磁盘IO:

sar -u 1 10 
sar -d 1 10 

你应用程序听起来像是myISAM的候选人。这听起来像你有很多硬件。在这种情况下,您可以构建一个主服务器和一个自动复制的从服务器。但是,只需一台服务器即可。这将更容易维护。

+0

感谢您的信息。我使用sar以及vmstat,top,iostat等来监控负载。大多数情况下,CPU使用率低于20%,而40秒单一选择的iowait并不多。而对于innodb,我能够发送大量请求,以在一段较长的时间内获得持续90%至95%的CPU负载。也许我现在应该回滚到InnoDB ... – 2010-10-03 02:45:47

+0

嗯。也许你的集群网络饱和。 – 2010-10-03 11:32:33

+0

所有数据节点,MGM节点,SQL节点都在同一个框中。如何验证网络负载?谢谢! – 2010-10-04 02:40:00