Also grundsaetzlich lass' dir von der Datenbank mal erklaeren wie die Query ausgefuehrt wird, in den meisten geht das mit einen vorangestellen "EXPLAIN", also einfach das SQL ausfuehren "EXPLAIN SELECT Count(id) ...". Und dann kann man sich fragen:
1. Kann ich einen Index legen auf die Felder welche im "where" stehen" um das zu beschleunigen?
2. Kann ich die Datenbank-Struktur aendern um einen Index zu ermoeglichen?
3. Hardware aendern? Server-Setup aendern?
In dem Fall bin ich mir offengestanden nicht sicher, ich glaube dass dir hier sogar ein Index nicht helfen wird am Ende, dass wird immer auf einen Full-Table-Scan hinauslaufen. Weil du willst wissen welche von "A" nicht in "B" vorkommen, dafuer muss man zumindest alle von "A" durchlaufen. Ein Index auf "tableB.p_id" sollte helfen, falls dieser noch nicht existiert, aber ich glaube dass wird immer ein Full-Table-Scan werden von zumindest von "A".
Du koenntest die Datenbank-Struktur aendern, und in "A" eine Spalte haben welche angibt ob es "B" gibt. Das wuerde erlauben einen Index darauf zu setzen, und muesste blitzeschnell sein. Nachteil ist, irgendein Teil der Geschaeftslogik muss die Spalte warten (oder ein Trigger in der Datenbank zum Beispiel).
Was eventuell auch geht ist dass du mal schaust ob die Datenbank "optimal" eingerichtet ist. Laeuft das Ding auf einer Kruecke mit 6GB RAM und du hast 12GB Daten? Dann mehr Speicher. Ist die Konfiguration vielleicht sub-optimal? Sowas.
Aber eventuell, ist die 1 MInute auch das schnellste was du bekommst (glaube ich aber ehrlich gesagt nicht, das muessten schon echt viele Daten sein dafuer).