我有一个运行大约24小时的SQL查询。 我想知道是否有办法优化它。
查询是:
update r, t set r.a1 = t.a2, r.b1 = t.b1 where r.c = t.c and r.d1 = t.d2 and r.e1 = t.e2 and r.f1 = t.f2;
表r有大约2,000,000行,定义为:
Field Type Collation Null Key Default Extra
----- -------- --------- ---- --- ------ --------------
id int(11) (NULL) NO PRI (NULL) auto_increment
a1 blob (NULL) YES (NULL)
e1 tinyblob (NULL) YES MUL (NULL)
f1 int(11) (NULL) YES MUL (NULL)
c int(11) (NULL) YES MUL (NULL)
b1 int(11) (NULL) YES MUL (NULL)
d1 int(11) (NULL) YES MUL (NULL)
表t有大约1,200,000行,定义为:
Field Type Collation Null Key Default Extra
----- -------- --------- ---- ------ ------- --------------
c int(11) (NULL) NO MUL 0
d2 int(11) (NULL) NO MUL 0
e2 tinyblob (NULL) YES MUL (NULL)
f2 int(2) (NULL) NO MUL (NULL)
a2 blob (NULL) YES (NULL)
b1 int(11) (NULL) YES 0
id int(11) (NULL) NO PRI (NULL) auto_increment
我想知道是否有办法优化查询?
谢谢!
答案 0 :(得分:0)
您的索引键的排序方式应与where语句相同。
r
表键:
c,d1,e1,f1
和t
表键:
c,d2,e2,f2
您是否需要r
列b1
表中的密钥?
答案 1 :(得分:0)
你的结构似乎很好。
2M行没那么多。您的行可能很大(使用blobs
),但您所做的比较仅适用于整数值。它应该更快。
尝试在表上运行ANALYZE
,OPTIMIZE
,CHECK
,REPAIR
命令,以确保正确构建索引。
完成此操作后,您应该尝试深入研究系统。 什么在减慢查询速度?它可以是:
使用监控来获取有关sql缓存,内存使用情况等的数据。 它可以帮助您诊断问题。
答案 2 :(得分:0)
试试这个
update r left join t on r.c = t.c and r.d1 = t.d2 and r.e1 = t.e2 and r.f1 = t.f2 set r.a1 = t.a2, r.b1 = t.b1
也做一些改变
将表r
使c,d2,e2列在表t