php.de

Zurück   php.de > Webentwicklung > Datenbanken

Datenbanken SQL und Co

Antwort
 
LinkBack Themen-Optionen Thema bewerten
Alt 13.07.2005, 19:42  
Benutzer
 
Registriert seit: 13.07.2005
Beiträge: 69
madhatter
Standard Funktion für seitenweises Blättern bei großen Datenmengen

Ich habe ein großes Problem.
Ich habe eine Datenbank mit ziemlich vielen Datensätzen drin. Es sind sicherlich mehr als 300 Tsd. Zeilen. Hieraus sollen zwei Spalten nach verschiedenen Begriffen durchgesucht werden. Das ist natürlich kein Problem. Mit LIMIT im query frage ich nacheinander die Ergebnisse aus der Datenbank, je 20 pro Seite ab. Die Abfrage läuft ziemlich schnell.

Um aber die Blätter-Navigation zu erstellen muss ich alle Datensätze durchsuchen um mit SELECT COUNT(*) die gesamtanzahl der Ergebnisse festzustellen. Aus der Gesamtzahl der Ergebnisse kann ich dann ableiten wieviele Seiten es letzendlich werden.

Das Problem nun ist, dass die Abfrage der Anzahl aller Ergebnisse ziemlich lange dauert. Sowas kann ich den Besuchern nicht zumuten.

Nun habe ich gedacht, dass man vielleicht im Voraus in der Datenbank irgendeine Art Index hinterlegen könnte welcher festhält wieviele Einträge pro gesuchtes Wort in der Datenbank vorliegen. So könnte ich ziemlich schnell die Anzahl abfragen.
Sowas kann ich aber hier nicht realisieren, da ich nicht weiß, nach welchen Begriffen die Besucher suchen werden.

Habt Ihr vielleicht eine Idee, wie ich diesem Problem begegnen muss. Wie lösen sowas andere z.B. Google. Die haben sicher noch ein paar mehr Daten als ich und trotzdem geht das bei Ihnen ziemlich flot (klar, die haben bessere Technik und nutzen auch sicher ein anderes Datenbank-System).

Für Vorschläge wäre ich sehr dankbar.
madhatter ist offline   Mit Zitat antworten
Sponsor Mitteilung
PHP Code Flüsterer

Registriert seit: 21.08.2005
Beiträge: 4682
PHP-Kenntnisse:
Fortgeschritten

Alt 13.07.2005, 20:27  
Waq
Erfahrener Benutzer
 
Registriert seit: 15.08.2004
Beiträge: 2.473
Waq
Standard

Google etc. machen das, indem die ihre DB-Abfragen optimieren.
Wenn deine Abfrage zu lange dauert, machst Du wohl was falsch.
Mehr kann man dazu ohne hellseherische Fähigkeiten nicht sagen.

Der Beitrag wurde verschoben, wegen...
... Postings im falschen Forum. Bitte beim nächsten Mal darauf achten..

moved to MYSQL
__________________
mod = master of disaster
Waq ist offline   Mit Zitat antworten
Alt 13.07.2005, 21:04  
Benutzer
 
Registriert seit: 13.07.2005
Beiträge: 69
madhatter
Standard

Mensch Waq... vielen Dank. Dann weiß ich worans lag
madhatter ist offline   Mit Zitat antworten
Alt 13.07.2005, 21:30  
Erfahrener Benutzer
 
Registriert seit: 29.10.2004
Beiträge: 1.781
derHund
Standard

- wie sehen deine tabellen aus?
- wie sehen deine queries aus?
- was sagt EXPLAIN?
__________________
derHund ist offline   Mit Zitat antworten
Alt 14.07.2005, 09:29  
Benutzer
 
Registriert seit: 13.07.2005
Beiträge: 69
madhatter
Standard

Das ist die Tabelle:

CREATE TABLE `produkt` (
`produktID` int(10) unsigned NOT NULL auto_increment,
`produktName` varchar(200) character set latin1 collate latin1_general_ci NOT NULL default '',
`hersteller_produktName` varchar(200) character set latin1 collate latin1_general_ci NOT NULL default '',
`preis` double(10,2) unsigned default NULL,
`link` varchar(255) character set latin1 collate latin1_general_ci NOT NULL default '',
PRIMARY KEY (`produktID`),
KEY `herstellerName` (`herstellerName`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=1924198 ;

und hier der query:

SELECT COUNT(*) AS num_entries FROM produkt WHERE produktName LIKE '%".$keyword."%' OR hersteller_produktName LIKE '%".$keyword."%'

EXPLAIN muss ich noch mal machen.
Ich habe noch mal nachgeschaut. Es sind nicht 300 Tsd. sondern ca. 2 Mio. Zeilen.
madhatter ist offline   Mit Zitat antworten
Alt 14.07.2005, 09:47  
axo
Erfahrener Benutzer
 
Registriert seit: 24.12.2004
Beiträge: 1.814
axo ist zur Zeit noch ein unbeschriebenes Blatt
Standard

mach's so, wie du's im ersten posting bereits gesagt hast:
zusätzliche tabelle mit der anzahl der postings oder noch besser

search:
searchID | keyword | productID ... (UNIQUE keyword, productID)
... d.h. bei jeder suche schaust du erstmal ob nach dem keyword schon einmal gesucht wurde, wenn nein, startest du eine neue suche, und zwar mit

INSERT IGNORE INTO search (keyword,productID) VALUES (SELECT '$keyword', productID FROM ding WHERE produktName LIKE blah) ...

und dann gibst du die suchergebnisse mithilfe deines COUNT(*) FROM search WHERE keyword = $keyword aus ...

vielleicht hilft das schon - du solltest natürlich eine LIIKE-abfrage nicht zweimal starten.
axo ist offline   Mit Zitat antworten
Alt 14.07.2005, 14:56  
Benutzer
 
Registriert seit: 13.07.2005
Beiträge: 69
madhatter
Standard

Vielen Dank.
Ich werde es ausprobieren.
madhatter ist offline   Mit Zitat antworten
Alt 14.07.2005, 15:32  
Waq
Erfahrener Benutzer
 
Registriert seit: 15.08.2004
Beiträge: 2.473
Waq
Standard

Zitat:
Zitat von madhatter
produktName LIKE '%".$keyword."%'
Das ist schonmal ungünstig. Mit dem % am Anfang kann man keinen Index benutzen, eine Volltextsuche (nur nach ganzen Wörtern, nicht nach Wortbestandteilen) ist nicht machbar?

Zitat:
Zitat von madhatter
OR
Und das ist der Killer. Müsste man irgendwie vermeiden, z.B. über getrennte Abfragen und ein UNION.

Fulltext-Indizes auf produktName und hersteller_produktName wären natürlich noch anzulegen.
__________________
mod = master of disaster
Waq ist offline   Mit Zitat antworten
Alt 14.07.2005, 17:11  
Gast
 
Beiträge: n/a
Standard

phpBB z.B. trennt neue Beiträge -wenn sie eingetragen werden- in die einzelnen Worte auf und trägt diese in zwei Tabellen ein.
1) wort_id, wort
2) wort_id, post_id

also z.B. 34,hallo und 34,9001
im post mit der id 9001 befindet sich das Wort hallo
Das werden ziemlich große Tabellen, dafür geht die Suche schnell.
  Mit Zitat antworten
Antwort


Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an
Gehe zu

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
JS: Einführung - Javascript im Schichtenmodell nikosch Tutorials 4 11.04.2009 17:06
PHP-GTK Tutorial Beitragsarchiv 9 02.11.2005 21:07
Rückgabewert einer rekrusiven Funktion PHP-Fortgeschrittene 7 06.10.2005 18:44
(schnellere) Funktion zum Zusammenfassen von CSS PHP-Fortgeschrittene 21 08.08.2005 16:47
Funktion in einer Funktion aufrufen? PHP Tipps 2005-2 11 14.06.2005 15:14
[Erledigt] Wie kann ich beliebig viele Werte an eine Funktion übergeben PHP Tipps 2005 11 25.01.2005 10:44

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
seitenweises blättern mit php, php datenbank blättern, php datensatz blättern funktion, seitenweises blättern, weiterblättern funktion webseiten, php blätterfunktion bei großer datenmenge, google in ergebnisliste blättern, php blättern function, seitenweises blättern website, function blättern php, php blättern datensatz wie google, funktion bletter, blättern im ergebnis php realisieren

Alle Zeitangaben in WEZ +2. Es ist jetzt 11:10 Uhr.




Powered by vBulletin® Version 3.7.2 (Deutsch)
Copyright ©2000 - 2012, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0
Aprilia-Forum, Aquaristik-Forum, Liebeskummer-Forum, Zierfisch-Forum, Geizkragen-Forum

Creative Commons License
Dieser Inhalt ist unter einer Creative Commons-Lizenz lizenziert.