SQL: Add packages.c_hasman cache to speed up package listings
Going from average ~100ms to ~10ms or so. The previous query had a tendency to be much slower sometimes, let's see if this cache also takes care of those outliers. Migration script: ALTER TABLE packages ADD COLUMN c_hasman boolean NOT NULL DEFAULT FALSE; DROP INDEX packages_system_name_key; CREATE UNIQUE INDEX packages_system_name_key ON packages (system, name) INCLUDE (id, c_hasman, dead); UPDATE packages SET c_hasman = NOT c_hasman WHERE c_hasman <> EXISTS(SELECT 1 FROM package_versions pv WHERE pv.package = packages.id AND EXISTS(SELECT 1 FROM files f WHERE f.pkgver = pv.id));
This commit is contained in:
parent
5d56bded66
commit
1ee5c9c2df
4 changed files with 34 additions and 15 deletions
13
www/index.pl
13
www/index.pl
|
|
@ -77,9 +77,6 @@ sub normalize_name { $_[0] =~ s/%5b/[/irg =~ s/%5d/]/irg =~ s/%20/ /rg }
|
|||
sub shorthash_to_hex { unpack 'H*', pack 'i', $_[0] } # int -> hex
|
||||
sub shorthash_to_int { unpack 'i', pack 'H*', $_[0] } # hex -> int
|
||||
|
||||
# Subquery returning all packages that have a man page.
|
||||
my $packages_with_man = '(SELECT * FROM packages p WHERE EXISTS(SELECT 1 FROM package_versions pv WHERE pv.package = p.id AND EXISTS(SELECT 1 FROM files f WHERE f.pkgver = pv.id)))';
|
||||
|
||||
sub escape_like { $_[0] =~ s/([_%\\])/\\$1/rg }
|
||||
|
||||
sub sql_join {
|
||||
|
|
@ -111,8 +108,8 @@ sub pkg_frompath {
|
|||
|
||||
my $pkg = tuwf->dbRowi('
|
||||
SELECT id, system, name
|
||||
FROM', $packages_with_man, 'p
|
||||
WHERE', $sys_where, 'AND name IN', \@names, '
|
||||
FROM packages p
|
||||
WHERE c_hasman AND', $sys_where, 'AND name IN', \@names, '
|
||||
ORDER BY system DESC, length(name) DESC
|
||||
LIMIT 1
|
||||
');
|
||||
|
|
@ -928,10 +925,10 @@ TUWF::get qr{/pkg/([^/]+)} => sub {
|
|||
p => { onerror => 1, uint => 1, range => [1,200] },
|
||||
)->data;
|
||||
|
||||
my $where = sql 'NOT dead AND system =', \$sys->{id}, $f->{c} ne 'all' ? ('AND match_firstchar(name,', \$f->{c}, ')') : ();
|
||||
my $count = tuwf->dbVali('SELECT count(*) FROM', $packages_with_man, 'p WHERE', $where);
|
||||
my $where = sql 'c_hasman AND NOT dead AND system =', \$sys->{id}, $f->{c} ne 'all' ? ('AND match_firstchar(name,', \$f->{c}, ')') : ();
|
||||
my $count = tuwf->dbVali('SELECT count(*) FROM packages p WHERE', $where);
|
||||
my $pkg = tuwf->dbPagei({ results => 200, page => $f->{p} },
|
||||
'SELECT id, system, name FROM', $packages_with_man, 'p WHERE', $where, 'ORDER BY name'
|
||||
'SELECT id, system, name FROM packages p WHERE', $where, 'ORDER BY name'
|
||||
);
|
||||
|
||||
framework_ title => $sys->{full}, mainclass => 'pkglist', sub {
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue