MySQL提高性能大表

时间:2011-06-02 02:08:54

标签: mysql

我是MySQl的新手。请原谅一些错误的术语。我有一个关于在MySQL中索引和拆分表的问题。我正在使用Web服务器。经常查询有3个非常大的表。表格及其字段如下:

对齐方式:ali_id,chain1_id,chain2_id .....;种子:seed_id,ali_id,.....;片段:seed_id .......

种子包含给定对齐的一个或多个记录。片段包含Seed的一个或多个记录。

表的大小是Alignment - 8.3GB,Seed - 26GB和Fragment - 127GB

这些表具有非常大的索引:Alignment具有chain1_id,chain2_id,ali_id,(chain1_id和chain2_id)和(chain2_id和chain1_id)的索引。结果索引文件本身的大小为27G,大约是Alignment表的3倍大小。

这是否合适?

此外,由于表大小变得非常大,服务器会继续崩溃。将表格拆分成较小的表格是个好主意。我很困惑,因为我不确定多个select语句是否也会减慢服务器的速度。

谢谢。

此致 阿米特。

表已由其他人创建。我猜他们如下:

create Table Alignment (
 ali_id int(11) PRIMARY KEY, 
 chain_id1 int(11), 
 chain_id2 int(11), 
 param_id smallint(6), 
 date datetime); 

create Table Seed(
 seed_id int(11), 
 Ne smallint(5), 
 rmsd float, 
 ali_id int(11), 
 identics smallint(6)); 

* Seed has 5 more fields, all are smallint(6)

create table Fragment (
 start1 smallint(6), 
 start2 smallint(6), 
 len smallint(6), 
 seed_id bigint(20));

需要很长时间的查询是:

select a.chain_id2, s.Ne, s.rmsd, s.zN, s.ali_id, s.identics, s.positives, s.nFrg, s.cMatch, s.cont1, s.cont2, s.bMatch, s.back1, s.back2, s.seed_id 

from Alignment AS a, Chain AS c, Seed AS s 

WHERE (a.chain_id1 = c.chain_id) and a.ali_id = s.ali_id and c.pdb_chain = "$pdb_here" and s.zN > $ZLIM;

命中数可能在100-2000之间变化

它运行在Linux机器上的apache服务器上,配备Intel四核2.5 GHz,内存为4 GB。

3 个答案:

答案 0 :(得分:1)

分区 该表将是显而易见的起点

答案 1 :(得分:0)

我可能认为您的数据库尚未优化。在MySQL中,你可以重建索引,你可以优化表,你可以执行一些表维护语句[1]

[1] http://dev.mysql.com/doc/refman/5.1/en/table-maintenance-sql.html

下一步,看到您的数据可能呈指数级增长 看看http://www.mysql.com/products/cluster/,看看你是否也可以为此做好准备。

答案 2 :(得分:0)

不要担心表格的大小。如果确保正确设置了索引,应该不会导致任何问题。此外,您希望确保任何冗余信息都存储在单独的数据库中。您可以通过JOIN查询轻松检索它。

如果你的服务器一直处于崩溃状态,它或者没有足够的能力来处理负载(数据库很大,我认为你也有很多访问者的负载)或者你可能有一些硬件问题(比如有故障的硬盘,例如)。此外,您的查询可能需要一些优化。慢查询会导致您的表被锁定超过一段时间,保持新查询....以及任何以下情况都不好。

相关问题