Ich habe eine Datenbanktabelle, die importierte Informationen speichert. Aus Gründen der Einfachheit seiner etwas wie:MySQL Abfrageoptimierung
CREATE TABLE `data_import` (
`id` INT(11) UNSIGNED NOT NULL AUTO_INCREMENT,
`amount` DECIMAL(12,2) NULL DEFAULT NULL,
`payee` VARCHAR(50) NULL DEFAULT NULL,
`posted` TINYINT(1) NOT NULL DEFAULT 0,
PRIMARY KEY (`id`),
INDEX `payee` (`payee`)
)
Ich habe auch eine Tabelle, die Importregeln speichert:
CREATE TABLE `import_rules` (
`id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
`search` VARCHAR(50) NULL DEFAULT NULL,
PRIMARY KEY (`id`),
INDEX `search` (`search`)
)
Die Idee ist, dass für jede importierte Transaktion, die Abfrage eine einzelne passende Regel versuchen muss finden - Diese Übereinstimmung erfolgt in den Feldern data_import.payee und import_rules.seach. Da beide VARCHAR-Felder sind, habe ich sie indiziert, um die Abfrage schneller zu machen.
Das ist, was ich bisher gefunden habe, scheint gut zu funktionieren. Obwohl langsamer als ich gehofft hatte.
SELECT i.id, i.payee, i.amount, i.posted r.id, r.search
FROM import_data id
LEFT JOIN import_rules ir on REPLACE(i.payee, ' ', '') = REPLACE(ir.search, ' ', '')
Eine Sache, die die obige Abfrage nicht für nicht gerecht zu werden, ist, dass import_data.posted if = 1 ist, dann nicht, ich brauche eine Regel für diese Zeile zu finden - ist es möglich, die Abfrage an diesem Beitritt zu stoppen Reihe? Wenn der Zahlungsempfänger gleich null ist, sollte er es ebenfalls nicht versuchen.
Gibt es noch andere Möglichkeiten, das kann ich optimieren? Ich stelle fest, dass das Erstellen von Text-Joins nicht ideal ist ... nicht sicher, ob es bessere Methoden gibt.