我发布此帖子是为了对我的SQL查询的性能提出一些建议。
我实际上有两个表,一个叫HGVS_SNP
,大约44657169行,另一个叫run
表,平均有2000行。
当我尝试更新run table
的字段评论时,执行查询需要花费很多时间。我想知道是否有任何方法可以增加我的SQL查询。
HGVS_SNP结构表:
+-----------+-------------+------+-----+---------+-------+
| 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'
答案 0 :(得分: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'