针对点击报告执行错误的mysql查询

时间:2017-01-30 22:56:17

标签: php mysql

我已经建立了一个简单的php网站,用于从yourls链接缩短器进行点击报告。首先,我必须从url表中的长URL中提取“子”,然后按子组分组,提取关键字。使用关键字i遍历logtable并计算每次点击。 logTable有几百万个条目,url表有几个100k条目。所以实际上我需要大约5分钟来计算一天......所以它并没有真正起作用......

这个片段实际上做了以下工作:

$sql_get_keyword="SELECT keyword FROM yourls_url WHERE url LIKE '%_".$track_id."_%' COLLATE utf8_general_ci";
    $qry_get_keyword=mysqli_query($link, $sql_get_keyword);
    while ($row = mysqli_fetch_assoc($qry_get_keyword)) {
    $keywords[]=$row['keyword'];
    };  
    $sql = "
            select 
            substring_index(substring_index(url, IF(LOCATE('?tag=',url),'?tag=', '&tag='), -1),'-21', 1) Tag,
            (case
                        WHEN length(substring_index(url, 'subtag=', -1)) = 8 AND substring_index(url, 'subtag=', -1) REGEXP '^[0-9]_'  THEN SUBSTRING(substring_index(url, 'subtag=', -1), 3, 6)
                                    WHEN length(substring_index(url, 'subtag=', -1)) = 8 AND substring_index(url, 'subtag=', -1) REGEXP '^.{6}_[0-9]$' THEN LEFT(substring_index(url, 'subtag=', -1), 6)
                                    WHEN length(substring_index(url, 'subtag=', -1)) = 5 AND substring_index(url, 'subtag=', -1) REGEXP '^.{3}_[0-9]$' THEN LEFT(substring_index(url, 'subtag=', -1), 3)
                                    WHEN length(substring_index(url, 'subtag=', -1)) = 6 AND substring_index(url, 'subtag=', -1) REGEXP '^.{4}_[0-9]$' THEN LEFT(substring_index(url, 'subtag=', -1), 4)
                                    WHEN length(substring_index(url, 'subtag=', -1)) = 7 AND substring_index(url, 'subtag=', -1) REGEXP '^.{5}_[0-9]$' THEN LEFT(substring_index(url, 'subtag=', -1), 5)
                        ELSE substring_index(url, 'subtag=', -1)    
                END
                ) AS subid,
            SUM((SELECT COUNT(click_time)
                                FROM yourls_log  
                                WHERE yourls_log.shorturl = yourls_url.keyword 
                                AND ".$dateClause.")) klicks 
            FROM 
                yourls_url 
            WHERE
            (SELECT COUNT(click_time)
                                FROM yourls_log  
                                WHERE yourls_log.shorturl = yourls_url.keyword AND
                                    ".$dateClause.") > 0
            AND substring_index(substring_index(url, IF(LOCATE('?tag=',url),'?tag=', '&tag='), -1),'-21', 1) NOT Like 'it%'
            GROUP BY subid
            ORDER BY klicks DESC";      

我已经在“shorturl”上设置了一个索引,但这并没有真正起作用。有没有人知道如何在不改变数据库结构的情况下加快速度呢?

0 个答案:

没有答案