Hallo,
es geht um folgendes Problem im Rahmen meiner Doktorarbeit:
Ich bin in einer Pharmadatenbank auf der Suche nach Produktgruppen, die einen bestimmten Wirkstoff beinhalten (z.B. alle Medikamente mit Paracetamol).
Die einzelnen Datenbanken haben folgende Struktur:
DB mmi_produktgruppen: PRODUCTGROUPID | (GRUPPEN)NAME | PRODUCTID
Hier steht z.B. "Ben-u-ron" als eine Produktgruppe, von der es viele verschiedene Versionen (andere Dosierungen) gibt.
DB mmi_produkte: PRODUCTID | (MEDI)NAME
Hier ist jedes Produkt einzeln beeinhaltet (Bsp: Ben-u-ron 1000 mg, Ben-u-ron 500 mg, ...). Es ist aber sinnvoller, bei einer Suche zunächst nur die zugehörige Produktgruppe anzuzeigen und nicht direkt diese Datenbank zu verwenden.
DB mmi_p2w: PRODUCTID | MOLECULEID
Hier ist für jedes Medikament vermerkt, welche Inhaltsstoffe es hat. Bei "Ben-u-ron" steht dort entsprechend "Paracetamol".
DB mmi_wirkstoffe MOLECULEID | (WIRKSTOFF)NAME
Die IDs sind jeweils vom Typ MID, die Namen sind Strings.
Ich verwende folgendes Query zur Abfrage:
SELECT `PRODUCTGROUPID`,`NAME` FROM `mmi_produktgruppen` WHERE PRODUCTGROUPID IN
(SELECT DISTINCT `PRODUCTGROUPID` FROM `mmi_produkte` WHERE `PRODUCTID` IN
(SELECT `PRODUCTID` FROM `mmi_p2w` WHERE `MOLECULEID` = 298))
298 ist hier die MOLECULEID von Paracetamol.
Es sind Indizes über die alle verwendeten Spalten erstellt. Werden 2 Spalten abfragt, besteht ein Index über beide Spalten.
Mein Problem ist: Eine Abfrage dauert zwischen 10 und 15 Sekunden, weil es beispielsweise mehrere 100 Medikamente gibt, die Paracetamol beinhalten.
Wie kann ich den Query so optimieren, das er in < 1 Sek. läuft?
Vielen Dank!
-user6957
es geht um folgendes Problem im Rahmen meiner Doktorarbeit:
Ich bin in einer Pharmadatenbank auf der Suche nach Produktgruppen, die einen bestimmten Wirkstoff beinhalten (z.B. alle Medikamente mit Paracetamol).
Die einzelnen Datenbanken haben folgende Struktur:
DB mmi_produktgruppen: PRODUCTGROUPID | (GRUPPEN)NAME | PRODUCTID
Hier steht z.B. "Ben-u-ron" als eine Produktgruppe, von der es viele verschiedene Versionen (andere Dosierungen) gibt.
DB mmi_produkte: PRODUCTID | (MEDI)NAME
Hier ist jedes Produkt einzeln beeinhaltet (Bsp: Ben-u-ron 1000 mg, Ben-u-ron 500 mg, ...). Es ist aber sinnvoller, bei einer Suche zunächst nur die zugehörige Produktgruppe anzuzeigen und nicht direkt diese Datenbank zu verwenden.
DB mmi_p2w: PRODUCTID | MOLECULEID
Hier ist für jedes Medikament vermerkt, welche Inhaltsstoffe es hat. Bei "Ben-u-ron" steht dort entsprechend "Paracetamol".
DB mmi_wirkstoffe MOLECULEID | (WIRKSTOFF)NAME
Die IDs sind jeweils vom Typ MID, die Namen sind Strings.
Ich verwende folgendes Query zur Abfrage:
SELECT `PRODUCTGROUPID`,`NAME` FROM `mmi_produktgruppen` WHERE PRODUCTGROUPID IN
(SELECT DISTINCT `PRODUCTGROUPID` FROM `mmi_produkte` WHERE `PRODUCTID` IN
(SELECT `PRODUCTID` FROM `mmi_p2w` WHERE `MOLECULEID` = 298))
298 ist hier die MOLECULEID von Paracetamol.
Es sind Indizes über die alle verwendeten Spalten erstellt. Werden 2 Spalten abfragt, besteht ein Index über beide Spalten.
Mein Problem ist: Eine Abfrage dauert zwischen 10 und 15 Sekunden, weil es beispielsweise mehrere 100 Medikamente gibt, die Paracetamol beinhalten.
Wie kann ich den Query so optimieren, das er in < 1 Sek. läuft?
Vielen Dank!
-user6957
Comment