簡體   English   中英

加快SQL循環

[英]Speeding up SQL loop

我的PHP代碼中有一個嵌套循環,該循環需要很長時間,並且想知道有沒有一種方法可以加快速度:

$sql = "SELECT * FROM table_1";
$result = mysqli_query($sql);
while($row = mysqli_fetch_array($result)){

    $sql2 = "
    SELECT count(*) 
FROM user_modules  
WHERE 
begin_ymdhi >= ".$date_from." AND 
begin_ymdhi <= ".$date_to." AND 
(
    completed_ymdhi IS NULL OR  
    completed_ymdhi = '' 
) AND 
user_id = ".$row['user_id']." AND 
task_id = ".$row['task_id']." AND 
    module_discon = 'N' 
    ";
}

外部查詢獲得1000行,內部查詢必須跨越10,000行-運行時間約為115秒! 是否可以使用其他方法或組合的SQL查詢來改進此方法?

不要使用嵌套查詢,而是通過聯接將它們組合成一個查詢:

SELECT t1.*, COUNT(u.user_id) ct
FROM table_1 t1
LEFT JOIN user_modules AS u ON u.user_id = t1.user_id AND u.task_id = t1.task_id
    AND u.begin_ymdhi BETWEEN '$date_from' AND '$date_to'
    AND u.module_discon = 'N'
GROUP BY t1.user_id, t1.task_id
SELECT user_modules.user_id, user_modules.task_id, count(*) 
FROM user_modules LEFT JOIN table_1 USING (user_id, task_id) 
WHERE  
begin_ymdhi >= ".$date_from." AND 
begin_ymdhi <= ".$date_to." AND 
    module_discon = 'N' AND
(
    completed_ymdhi IS NULL OR  
    completed_ymdhi = '' 
) 
GROUP BY user_modules.user_id, user_modules.task_id

在整個SELECT語句之前添加EXPLAIN (即EXPLAIN SELECT count(*)... ),然后MySQL將為您提供關於select所做操作的摘要。

確保begin_ymdhi字段已正確索引。 SHOW INDEX FROM table_2以查看。

task_id是唯一的嗎? 如果是這樣,最直接的方法將是:

 $sql2 = "
    SELECT count(task_id) AS TaskCount
FROM user_modules  
WHERE 
begin_ymdhi >= ".$date_from." AND 
begin_ymdhi <= ".$date_to." AND 
(
    completed_ymdhi IS NULL OR  
    completed_ymdhi = '' 
) AND module_discon = 'N'  
group by user_id
";

$result = mysqli_query($sql2);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM