Momentan klingt das so, als würdest Du 3 mal alle Daten laden, um sie dann programmatisch auszuwerten.
Das ist für mich "eine Datenbank" nachprogrammieren!
Wenn es Auswahlkriterien gibt, dann kämen die bei mir (möglichst stark einschränkend, also die kleinstmögliche Ergebnismenge liefernd, die für die Erledigung der übrigen Auswertung zwingend erforderlich ist) in die jeweilige Where-Bedingung.
Also quasi:
1. Instanz hat die Kriterien a+b+c und wertet die Daten aus. -> select * from Tabelle where kriterien = a+b+c
2. Instant hat die Kriterien d+e+f und wertet die Daten aus. -> select * from Tabelle where kriterien = d+e+f
3. Instant hat die Kriterien g+h+i und wertet die Daten aus. -> select * from Tabelle where kriterien = g+h+i
aber keinesfall 3 mal -> select * from Tabelle
(Tabelle steht hier für einen beliebig einfachen oder beliebig komplexen Join über x Tabellen, der Stern für die minimal erforderlichen Spalten dieser Abfrage. Was nicht im Programm benötigt wird, kommt (bei mir grundsätzlich) auch nicht in die Spaltenauswahl des Selects - spart ggfls. gigantische Mengen an Speicher.)
Die Stärke von Datenbanken ist ja nicht nur "Unmengen von Daten" vorhalten zu können, sondern eben auch derern gezielte Auswertung.
Programmatisch werte ich nur das aus, von dem definitiv feststeht, dass es mit Datenbankmitteln nicht auswertbar ist.
Ist mir in den letzten ca. 20 Jahren nicht mehr passiert
Um Deine Frage genauer beantworten zu können und ggfls Abhilfe beim bestehenden Problem geben zu können, müsstest Du die Aufgabenstellung bitte etwas präzisieren.
10.000.000 Datensätze und die von Dir genannte Art von Kriterien alleine reicht nicht aus, um zu dem Schluss kommen zu können:
Die Auswertung ist nicht durch die Datenbank durchführbar, alle Daten müssen programmatisch außerhalb der Datenbank ausgewertet werden.
Was ebenfalls unklar ist: Gibt es drei
MySQL-Instanzen, die jeweils 3-4 GB benötigen
oder
benötigen drei Instanzen Deines Programmes jeweils 3-4 GB Speicher?