Hi,
CREATE INDEX indexname ON tabellenname (zahlenfeld, ip (15), page (250), nochwasanderes)
"ip" war als TINYTEXT, "page" als TEXT definiert. Die Breite der Spalte "ip" ergibt sich aus der Maximallänge einer IP-Adresse (logisch).
Füllen konnte ich beide Spalten hervorragend, und nach allen Regeln der Kunst stimmte der Inhalt auch exakt mit dem überein, was drin stehen sollte. Nchdem der Index jedoch angelegt war, brachte ein Billig-Select der Art
SELECT page, count(*)
FROM tabelle
WHERE zahlenfeld=? AND ip=?
GROUP BY page
Hast du daran gedacht, deine Nichtnumerischen Datenbankfelder zu quoten?
Ich hab mir fuer solche Abfragen eine Routine gebaut, die so aussieht:
(REadDBStructure entaehlt dabei ein Hash, worin nur steht, von welchem Typ
welches Datenbankfeld ist)
sub MakeRequest {
my $table = shift;
my $request = shift;
my $like = shift;
my @input = split(/,\s*/,$request);
my %hash;
my $i;
my %STRUCTURE = ReadDBStructure($CONFIG{'DB_STRUCTURE_FILE'});
my $query;
my ($keyname, $value);
my $this;
my %result;
my %realresult;
my $count;
my $key;
if (not $table) {
return;
}
if ($request) {
for ($i=0; $i<=$#input; $i++) {
($keyname, $value) = split(/ = /,$input[$i],2);
if ($like) {
# $value = "%".$value."%";
$this = $value;
} else {
if ($STRUCTURE{$table}{'struc'}{$keyname} !~ /^(TINYINT|SMALLINT|MEDIUMINT|INTEGER|BIGINT)/) {
$this = $dbh->quote($value);
} else {
$this = $value;
$this =~ s/[^0-9.,-]//gi;
}
}
if ($like) {
if ($query) {
$query .= "\nAND $keyname LIKE '%".$this."%'";
} else {
$query .= "$keyname LIKE '%".$this."%'";
}
} else {
if ($query) {
$query .= "\nAND $keyname = $this";
} else {
$query .= "$keyname = $this";
}
}
}
$query = "SELECT * FROM $table\nWHERE $query";
} else {
$query = "SELECT * FROM $table";
}
my $sth = $dbh->prepare($query);
$sth->execute();
while (my $ref = $sth->fetchrow_hashref()) {
$count++;
foreach $key (keys %$ref) {
$result{$count}{$key} = $ref->{$key};
}
}
$sth->finish();
return %result;
}
Ciao,
Wolfgang