MySQL提高大型表的性能

MySQL提高大型表的性能,mysql,Mysql,我是MySQl新手。请原谅一些错误的术语。我有一个关于MySQL中索引和拆分表的问题。我正在网络服务器上工作。有3个非常大的表经常被查询。表及其字段如下所示: 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 in

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

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));
对齐:ali_id、chain1_id、chain2_id。。。。。;种子:种子id,阿里id。。。。。;片段:种子id

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

表的大小是对齐-8.3GB、种子-26GB和片段-127GB

这些表具有非常大的索引:路线具有chain1_id、chain2_id、ali_id、(chain1_id和chain2_id)和(chain2_id和chain1_id)的索引。结果,索引文件本身的大小是27G,大约是对齐表大小的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不等


它在apache服务器上运行,Linux机器上有英特尔四核@2.5 GHz,内存为4 GB

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

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

下一步,看到您的数据可能呈指数级增长。

看看,看看你是否也能做好准备。

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


如果您的服务器持续崩溃,它可能无法处理负载(对于如此大的数据库,我假设您也有相当多的访问者负载),或者可能存在一些硬件问题(例如,有故障的HDD)。此外,您的查询可能需要一些优化。缓慢的查询可能会导致表被锁定更长的时间,从而使新的查询被搁置……而且,下面的任何情况都不好。

分区将是一个明显的起点。

如果您向我们展示“创建表”语句和一些典型的(缓慢的)查询,表可能会有所帮助。还有您的服务器规格。您能否发布
创建表对齐的输出以及种子和片段?您的查询是什么样子的?通常返回多少行?请编辑您的问题并在那里添加此额外信息。在评论中读起来太难了;)@迈克尔·罗宾逊——很抱歉。我是新来的。我已经编辑了这个问题。为什么Seed没有主键?优化表时,它只会解决删除开销之类的问题。这不是优化数据库的总体方法。这不是。但对于初始阶段,我建议作者通过这些命令进行“优化”/“清理”。同时,我们/或作者需要仔细检查这些表格,以便进一步推断或规范化。仅仅是基于这个问题,几乎没有人能够判断是查询还是表结构本身导致了速度的减慢。