如何通过多个连接加速MySQL查询

Bin*_*100 14 mysql sql join

这里是我的问题,我选择和做多加入,以获得正确的物品......它拉动了相当数量的行,超过100,000.当日期范围设置为1年时,此查询需要超过5分钟.

我不知道是否可能,但我担心用户可能会将日期范围延长至十年并使其崩溃.

谁知道我怎么能加快速度呢?这是查询.

SELECT DISTINCT t1.first_name, t1.last_name, t1.email 
FROM table1 AS t1 
INNER JOIN table2 AS t2 ON t1.CU_id = t2.O_cid 
INNER JOIN table3 AS t3 ON t2.O_ref = t3.I_oref 
INNER JOIN table4 AS t4 ON t3.I_pid = t4.P_id 
INNER JOIN table5 AS t5 ON t4.P_cat = t5.C_id 
WHERE t1.subscribe =1 
AND t1.Cdate >= $startDate
AND t1.Cdate <= $endDate
AND t5.store =2
Run Code Online (Sandbox Code Playgroud)

我不是最好的mysql所以任何帮助将不胜感激!

提前致谢!

UPDATE

这是你要求的解释

id  select_type     table   type    possible_keys   key     key_len     ref     rows    Extra
1   SIMPLE  t5  ref     PRIMARY,C_store_type,C_id,C_store_type_2    C_store_type_2  1   const   101     Using temporary
1   SIMPLE  t4  ref     PRIMARY,P_cat   P_cat   5   alphacom.t5.C_id    326     Using where
1   SIMPLE  t3  ref     I_pid,I_oref    I_pid   4   alphacom.t4.P_id    31   
1   SIMPLE  t2  eq_ref  O_ref,O_cid     O_ref   28  alphacom.t3.I_oref  1    
1   SIMPLE  t1  eq_ref  PRIMARY     PRIMARY     4   alphacom.t2.O_cid   1   Using where
Run Code Online (Sandbox Code Playgroud)

我还为table5行和table4行添加了一个索引,因为它们并没有真正改变,但是其他表每月大约有500-1000个条目...我听说你应该为一个包含许多新条目的表添加一个索引....这是真的?

Bob*_*ica 13

我试试以下内容:

首先,确保以下表和列上有索引(括号中的每组列应该是一个单独的索引):

table1 : (subscribe, CDate)
         (CU_id)
table2 : (O_cid)
         (O_ref)
table3 : (I_oref)
         (I_pid)
table4 : (P_id)
         (P_cat)
table5 : (C_id, store)
Run Code Online (Sandbox Code Playgroud)

其次,如果添加上述索引并没有像你想的那样改进,请尝试将查询重写为

SELECT DISTINCT t1.first_name, t1.last_name, t1.email FROM
  (SELECT CU_id, t1.first_name, t1.last_name, t1.email
     FROM table1
     WHERE subscribe = 1 AND
           CDate >= $startDate AND
           CDate <= $endDate) AS t1
  INNER JOIN table2 AS t2
    ON t1.CU_id = t2.O_cid   
  INNER JOIN table3 AS t3
    ON t2.O_ref = t3.I_oref   
  INNER JOIN table4 AS t4
    ON t3.I_pid = t4.P_id   
  INNER JOIN (SELECT C_id FROM table5 WHERE store = 2) AS t5
    ON t4.P_cat = t5.C_id
Run Code Online (Sandbox Code Playgroud)

我希望这里第一个子选择会显着减少要考虑加入的行数,希望使后续连接做得更少.同样在table5上第二个子选择背后的推理.

无论如何,搞乱它.我的意思是,最终它只是一个SELECT - 你不能用它真的伤害任何东西.检查每个不同排列产生的计划,并试图找出每个排列的好坏.

分享和享受.

  • 我最终使用了这个,它产生了巨大的影响,谢谢! (2认同)

JNK*_*JNK 8

确保您的日期列和您加入的所有列都已编入索引.

在你的日期做一个不等的运算符意味着它检查每一行,这本质上比等价的慢.

此外,使用DISTINCT可以为优化程序在后台运行的逻辑添加额外的比较.如果可能的话,消除它.