这里是我的问题,我选择和做多加入,以获得正确的物品......它拉动了相当数量的行,超过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 - 你不能用它真的伤害任何东西.检查每个不同排列产生的计划,并试图找出每个排列的好坏.
分享和享受.
确保您的日期列和您加入的所有列都已编入索引.
在你的日期做一个不等的运算符意味着它检查每一行,这本质上比等价的慢.
此外,使用DISTINCT可以为优化程序在后台运行的逻辑添加额外的比较.如果可能的话,消除它.