【问题标题】:Long SQL query - how to optimize?长 SQL 查询 - 如何优化?
【发布时间】:2013-10-30 16:27:41
【问题描述】:

我有一个运行大约 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

我想知道是否有办法优化查询?

谢谢!

【问题讨论】:

  • I have an sql query that run about 24 hours: 运行需要24小时吗? :-/
  • 是的:/这就是为什么我正在寻找一种优化它的方法。
  • 如果需要这么长时间,显然有些事情是非常错误的。你能从查询中加入解释语句吗?
  • 你能否提供我想查看索引的表中的实际创建语句。

标签: mysql optimization


【解决方案1】:

您的索引键的顺序应与您的 where 语句相同。 r表键:

c,d1,e1,f1

t 表键:

c,d2,e2,f2

您是否需要r 表中b1 列上的键?

【讨论】:

    【解决方案2】:

    你的结构看起来还不错。 2M 行并不多。您的行可能很大(使用blobs),但您所做的比较仅针对整数值。它应该更快。

    尝试在您的表上运行ANALYZEOPTIMIZECHECKREPAIR 命令,以确保您的索引构造正确。

    完成此操作后,您应该尝试在系统中进行更深入的调查。 是什么减慢了查询速度?可以是:

    使用监控来获取有关您的 sql 缓存、内存使用情况等的数据。 它将帮助您诊断问题。

    【讨论】:

      【解决方案3】:

      试试这个

      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
      

      也做一些改变

      • 使 c,d1,e1 列在表 r 中建立索引

      • 使 c,d2,e2 列在表 t 中建立索引

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-09-13
        • 2021-05-24
        相关资源
        最近更新 更多