query optimizations; split big feed update transaction

This commit is contained in:
Andrew Dolgov 2006-03-21 05:52:56 +01:00
parent 03f321db57
commit 44e241cb44
3 changed files with 43 additions and 9 deletions

View file

@ -19,10 +19,16 @@
$rows = -1; $rows = -1;
if (DB_TYPE == "pgsql") { if (DB_TYPE == "pgsql") {
$result = db_query($link, "DELETE FROM ttrss_user_entries WHERE /* $result = db_query($link, "DELETE FROM ttrss_user_entries WHERE
marked = false AND feed_id = '$feed_id' AND marked = false AND feed_id = '$feed_id' AND
(SELECT date_entered FROM ttrss_entries WHERE (SELECT date_entered FROM ttrss_entries WHERE
id = ref_id) < NOW() - INTERVAL '$purge_interval days'"); id = ref_id) < NOW() - INTERVAL '$purge_interval days'"); */
$result = db_query($link, "DELETE FROM ttrss_user_entries WHERE
ttrss_entries.id = ref_id AND
marked = false AND
feed_id = '$feed_id' AND
ttrss_entries.date_entered < NOW() - INTERVAL '$purge_interval days'");
$rows = pg_affected_rows($result); $rows = pg_affected_rows($result);
@ -40,10 +46,23 @@
} }
} }
function global_purge_old_posts($link, $do_output = false) { function global_purge_old_posts($link, $do_output = false, $limit = false) {
if (DB_TYPE == "mysql") {
$random_qpart = "RAND()";
} else {
$random_qpart = "RANDOM()";
}
if ($limit) {
$limit_qpart = "LIMIT $limit";
} else {
$limit_qpart = "";
}
$result = db_query($link, $result = db_query($link,
"SELECT id,purge_interval,owner_uid FROM ttrss_feeds ORDER BY id"); "SELECT id,purge_interval,owner_uid FROM ttrss_feeds
ORDER BY $random_qpart $limit_qpart");
while ($line = db_fetch_assoc($result)) { while ($line = db_fetch_assoc($result)) {
@ -239,7 +258,7 @@
if ($rss) { if ($rss) {
db_query($link, "BEGIN"); // db_query($link, "BEGIN");
$result = db_query($link, "SELECT title,icon_url,site_url,owner_uid $result = db_query($link, "SELECT title,icon_url,site_url,owner_uid
FROM ttrss_feeds WHERE id = '$feed'"); FROM ttrss_feeds WHERE id = '$feed'");
@ -389,6 +408,8 @@
if (!$num_comments) $num_comments = 0; if (!$num_comments) $num_comments = 0;
db_query($link, "BEGIN");
if (db_num_rows($result) == 0) { if (db_num_rows($result) == 0) {
// base post entry does not exist, create it // base post entry does not exist, create it
@ -533,6 +554,8 @@
} }
} }
db_query($link, "COMMIT");
/* taaaags */ /* taaaags */
// <a href="http://technorati.com/tag/Xorg" rel="tag">Xorg</a>, // // <a href="http://technorati.com/tag/Xorg" rel="tag">Xorg</a>, //
@ -549,6 +572,8 @@
if (count($entry_tags) > 0) { if (count($entry_tags) > 0) {
db_query($link, "BEGIN");
$result = db_query($link, "SELECT id,int_id $result = db_query($link, "SELECT id,int_id
FROM ttrss_entries,ttrss_user_entries FROM ttrss_entries,ttrss_user_entries
WHERE guid = '$entry_guid' WHERE guid = '$entry_guid'
@ -582,13 +607,14 @@
} }
} }
} }
db_query($link, "COMMIT");
} }
} }
db_query($link, "UPDATE ttrss_feeds db_query($link, "UPDATE ttrss_feeds
SET last_updated = NOW(), last_error = '' WHERE id = '$feed'"); SET last_updated = NOW(), last_error = '' WHERE id = '$feed'");
db_query($link, "COMMIT"); // db_query($link, "COMMIT");
} else { } else {
$error_msg = db_escape_string(magpie_error()); $error_msg = db_escape_string(magpie_error());

View file

@ -83,6 +83,7 @@ create table ttrss_entries (id serial not null primary key,
create index ttrss_entries_guid_index on ttrss_entries(guid); create index ttrss_entries_guid_index on ttrss_entries(guid);
create index ttrss_entries_title_index on ttrss_entries(title); create index ttrss_entries_title_index on ttrss_entries(title);
create index ttrss_entries_date_entered_index on ttrss_entries(date_entered);
create table ttrss_user_entries ( create table ttrss_user_entries (
int_id serial not null primary key, int_id serial not null primary key,

View file

@ -74,14 +74,21 @@
$result = db_query($link, "SELECT feed_url,id,owner_uid, $result = db_query($link, "SELECT feed_url,id,owner_uid,
SUBSTRING(last_updated,1,19) AS last_updated, SUBSTRING(last_updated,1,19) AS last_updated,
update_interval FROM ttrss_feeds ORDER BY last_updated DESC"); update_interval FROM ttrss_feeds ORDER BY last_updated DESC");
$user_prefs_cache = array();
while ($line = db_fetch_assoc($result)) { while ($line = db_fetch_assoc($result)) {
$upd_intl = $line["update_interval"]; $upd_intl = $line["update_interval"];
$user_id = $line["owner_uid"]; $user_id = $line["owner_uid"];
if (!$upd_intl || $upd_intl == 0) { if (!$upd_intl || $upd_intl == 0) {
$upd_intl = get_pref($link, 'DEFAULT_UPDATE_INTERVAL', $user_id); if (!$user_prefs_cache[$user_id]['DEFAULT_UPDATE_INTERVAL']) {
$upd_intl = get_pref($link, 'DEFAULT_UPDATE_INTERVAL', $user_id);
$user_prefs_cache[$user_id]['DEFAULT_UPDATE_INTERVAL'] = $upd_intl;
} else {
$upd_intl = $user_prefs_cache[$user_id]['DEFAULT_UPDATE_INTERVAL'];
}
} }
if ($upd_intl < 0) { if ($upd_intl < 0) {
@ -99,7 +106,7 @@
print "Updating...\n"; print "Updating...\n";
update_rss_feed($link, $line["feed_url"], $line["id"], true); update_rss_feed($link, $line["feed_url"], $line["id"], true);
sleep(3); // prevent flood (FIXME make this an option?) sleep(1); // prevent flood (FIXME make this an option?)
} else { } else {
print "Update not needed.\n"; print "Update not needed.\n";
} }