2017-09-07 1 views
0

Ich mache einige Web-Crawler und Einfügen des Ergebnisses in eine Datenbank. Es dauert ungefähr 2 Sekunden, um zu kratzen, aber viel länger zum Einfügen. Es gibt zwei Tabellen, Tabelle eins ist eine Liste von URLs und eine IDs, Tabelle zwei ist eine Reihe von TagIds und SiteIds.Wie kann ich eine SQL-Tabelle beschleunigen, die schnelles Einfügen und Auswählen erfordert?

Wenn ich den siteIds Indizes hinzufüge (die MD5-Hashes der URL sind, habe ich dies getan, weil es die Einfügung beschleunigt, da es nicht die Datenbank nach jeder URL-ID abfragen muss, um die Site-Tag-Paarungen hinzuzufügen) Die Geschwindigkeit der Einfügung fällt nach 300.000 Seiten von einer Klippe ab.

Beispiel
Tabelle 1

hash      |url    |title |description 
sjkjsajwoi20doi2jdo2xq2klm www.somesite.com somesite a site with info 

Table2

site      |tag 
sjkjsajwoi20doi2jdo2xq2klm xn\zmcbmmndkd2 

Als ich nahm die Indizes ging es viel schneller und ich konnte auf etwa 25 Millionen Datensätze in 12 Stunden hinzufügen, weg, aber die Suche nicht indizierte Tags ist einfach unmöglich.

Ich benutze PHP und MySQL für diese, ich bin offen für Vorschläge für eine bessere Möglichkeit, diese Daten zu organisieren.

+0

Eine ordnungsgemäß indizierte Tabelle würde schneller auswählen, als wenn Sie Indizes nicht ordnungsgemäß verwenden. – Qirel

Antwort

0

Hmm, das ist ein bisschen schwierig, da die Verlangsamung auf den Overhead der Datenbank zurückzuführen ist, die die Indexdatenstruktur aktualisieren muss, wenn jeder Datensatz eingefügt wird.

Wie greifen Sie darauf zu? PDO für PHP verwenden? Verwenden von Raw SQL? Vorbereitete Aussagen?

Ich würde auch sicherstellen, ob Sie Transaktionen benötigen oder nicht, da die db könnte implizit eine Transaktion verwenden, und das könnte die Einsätze verlangsamen. Für atomare Datensätze (Datensätze, die nicht gelöscht, aber gesammelt oder ohne normalisierte Fremdschlüssel-abhängige Datensätze sind), benötigen Sie diese nicht.

Sie könnten auch prüfen, ob ein STORED PROCEDURE eine bessere Effizienz hat (die Datenbank könnte möglicherweise optimieren, wenn sie eine gespeicherte Prozedur hat). Rufen Sie dann diese gespeicherte Prozedur einfach über das PDO auf. Es ist auch möglich, dass der Server/die Installation der Datenbank eine Hardwarebeschränkung hat, entweder Speicher (nicht auf SSD) oder die DB-Operationen/Installation kann nicht auf die volle Leistung der CPU zugreifen (niedrige Priorität im Betriebssystem, andere große Verarbeitung machen Die DB warten auf CPU-Zyklen, usw.).

Verwandte Themen