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