2016-04-25 110 views
3

我正在发布此线程以获得有关我的SQL查询性能的一些建议。 我实际上有2个表格,其中一个称为HGVS_SNP约44657169行,另一个表格为run,平均有2000行。 当我尝试更新我的run table的字段评论时,需要很长时间来执行查询。我想知道是否有任何方法来增加我的SQL查询。 HGVS_SNP表提高MySQL中的查询性能

结构:

+-----------+-------------+------+-----+---------+-------+ 
| Field  | Type  | Null | Key | Default | Extra | 
+-----------+-------------+------+-----+---------+-------+ 
| snp_id | int(11)  | YES | MUL | NULL |  | 
| hgvs_name | text  | YES |  | NULL |  | 
| source | varchar(8) | NO |  | NULL |  | 
| upd_time | varchar(32) | NO |  | NULL |  | 
+-----------+-------------+------+-----+---------+-------+ 

我跑表的结构如下:

+----------------------+--------------+------+-----+---------+-------+ 
| Field    | Type   | Null | Key | Default | Extra | 
+----------------------+--------------+------+-----+---------+-------+ 
| ID     | varchar(7) | YES |  | NULL |  | 
| Reference   | varchar(7) | YES | MUL | NULL |  | 
| HGVSvar2    | varchar(120) | YES | MUL | NULL |  | 
| Comment    | varchar(120) | YES |  | NULL |  | 
| Compute    | varchar(20) | YES |  | NULL |  | 
+----------------------+--------------+------+-----+---------+-------+ 

这里是我的查询:

UPDATE run 
INNER JOIN SNP_HGVS 
ON run.HGVSvar2=SNP_HGVS.hgvs_name 
SET run.Comment=concat('rs',SNP_HGVS.snp_id) WHERE run.Compute not like 'tron' 
+1

obviuos怀疑是你加入的字段有差异t类型和'hgvs_name'似乎缺少索引。 –

+0

这个“不喜欢”并不幸运,正如我所看到的那样,没有“计算”字段的索引 – vaso123

+0

在“计算”列上添加索引,如果没有必要则避免使用“LIKE” – mitkosoft

回答

3

我真的猜,因为你加入带有VARCHAR(120)列的文本列,您不需要文本列。使它成为一个VARCHAR,因此您可以索引它

ALTER TABLE `HGVS_SNP` modify hgvs_name VARCHAR(120); 

ALTER TABLE `HGVS_SNP` ADD KEY idx_hgvs_name (hgvs_name); 

这将需要一段时间对大表

现在你的JOIN要快很多,同时在计算列中添加索引

ALTER TABLE `run` ADD KEY idx_compute (compute); 

而LIKE是不必要的,将其改为

WHERE run.Compute != 'tron' 
+1

感谢所有的回复:)。 @米海,谢谢你,你的解决方案适合我。 – user979974