我已经建立了一个简单的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”上设置了一个索引,但这并没有真正起作用。有没有人知道如何在不改变数据库结构的情况下加快速度呢?