CodeIgniter großen Stapel legen
Ich bin derzeit erstellen Sie eine batch-Skript, dass Anrufe auf mehrere PHP-Skripte (die Nutzung von CodeIgniter) zu ziehen, die Daten aus einer DB, die Arbeit mit den Ergebnissen und legen Sie das Ergebnis in einer anderen DB. Um zu beginnen, ich weiß das ist vielleicht nicht das beste Werkzeug für den job, aber Sie haben zu tun, jetzt.
Aber zurück zum Thema, das script läuft gut und die performance ist ziemlich gut, außer für eine Methode. Es zieht Daten aus der ersten DB und fügt es in die zweite DB. Es ist eine Tabelle, die hat etwa 20 Spalten und 35000 Zeilen.
Ich bin mit einem einfachen $this->db->insert_batch('tablename', $insertdata);
- einfügen-Funktion diese Ergebnisse, aber irgendwie ist das Skript dauert etwa 15 Minuten zu führen...
Frage ist, wie, dieses Verfahren zu optimieren?
Vielen Dank im Voraus
BEARBEITEN
Hier ist die Abfrage, die ich verwenden, um die Tabelle zu erstellen, die auf die zweite DB, die DB, die die Daten wird eingefügt.
CREATE TABLE IF NOT EXISTS `invoices` (
`invoice_number` varchar(40) NOT NULL,
`shippinglist_number` varchar(40) DEFAULT NULL,
`shippinglist_line` varchar(255) DEFAULT NULL,
`customer_id` varchar(5) NOT NULL,
`deptor` varchar(5) NOT NULL,
`vat_number` int(255) DEFAULT NULL,
`invoice_date` date NOT NULL,
`expire_date` date NULL DEFAULT NULL,
`currency_code` varchar(10) NOT NULL,
`subtotal` decimal(19,4) NOT NULL,
`vat` decimal(19,4) NOT NULL,
`total` decimal(19,4) NOT NULL,
`qty` int(10) NOT NULL,
`partcode` varchar(255) NOT NULL,
`description` text,
`price` decimal(19,4) NOT NULL,
`pieces_per` int(10) NOT NULL,
`article_customer` varchar(255) DEFAULT NULL,
`reference_customer` varchar(255) DEFAULT NULL,
`sales_line_1` text,
`sales_line_2` text,
`sales_line_3` text,
`memo` text,
KEY `invoice_number` (`invoice_number`,`customer_id`,`deptor`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
Und die Abfrage ist ein ganz normaler insert -, aber die 35000 Zeilen gehackt in 100 Zeile setzt.
- Bitte posten Sie Ihre Abfrage und die Tabelle schema.
- Wie viele Indizes und Schlüssel werden erstellt auf Ihrem Tisch? Es sollte nicht so viel Zeit?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Versuchen, diese
split-array. 300, 300, 300 .... (mysql empfehlen zum einfügen von kleinen Daten). und insert_batch! und jeweils 300 Daten halten Transaktion. das ist alles. Sorry, ich bin nicht gut in Englisch.
array_chunck
die Art, wie es geschrieben, oder war es ein Tippfehler? Was passiert, wenn man das chunking? Und so weiter.) Und die Antworten sind wertvoll, vor allem weil Sie erklären mehr als nur der unmittelbare Kontext.Transaktionen verwenden - 1-commit ist immer schneller als 350 verpflichtet.
Edit:
Grundsätzlich müssen Sie Folgendes tun:
Versuchen Sie es mit
Dass die Art, wie Sie es Zeile um Zeile, und Sie sind nicht abhängig von einer großen sql-Abfrage.
So könnte man neu starten, whenver Sie wollte, wenn einige Fehler oder timeout aufgetreten waren.
Sind die Datenbanken auf dem gleichen server? Dann könnten Sie einfach eine Abfrage verwenden, kopieren Sie die Daten mit einem select aus der anderen Datenbank(wenn der gleiche Benutzer hat Zugriff auf beide)
insert_batch
Funktion zerlegt die Abfrage in Chargen von 100 selbst, so ist es ein bisschen zu tun, was Sie sagen.Dies ist eine alte post, aber für diejenigen, die hier gelandet bei der Suche nach einer Antwort auf diese vielleicht dieser link kann Ihnen helfen.
$this->db->save_queries = FALSE;
http://greeneggmedia.com/blog/entry/undocumented-codeigniter
Im hintergrund CI versuchen, speichern von Abfragen, die für die Profilerstellung, wenn Sie diese Funktion deaktivieren, können Sie gewinnen viel Zeit.
Wenn Sie nicht wie diese Antwort bitte nicht downvote. wurde nur versucht zu helfen.