【问题标题】:Improve query performance in MySQL提高 MySQL 中的查询性能
【发布时间】:2016-08-18 12:29:12
【问题描述】:

我发布这个帖子是为了获得一些关于我的 SQL 查询性能的建议。 我实际上有 2 个表,一个称为 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'

【问题讨论】:

  • 明显怀疑是您加入的字段类型不同,hgvs_name 似乎缺少索引。
  • 这个not like 不走运,正如我所见,Compute 字段上没有索引
  • Compute 列上添加索引,如果没有必要避免LIKE
  • 对于NOT LIKE,可以不用像“%tron%”这样的百分比来使用吗?

标签: mysql sql performance select join


【解决方案1】:

我猜是因为您加入了一个带有 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'

【讨论】:

  • 感谢大家的回复:)。 @Mihai,谢谢,您的解决方案适合我。
猜你喜欢
  • 2011-12-03
  • 2023-04-08
  • 1970-01-01
  • 2023-03-14
  • 1970-01-01
  • 1970-01-01
  • 2013-03-21
  • 2019-09-16
  • 1970-01-01
相关资源
最近更新 更多