Antje Hofmann: MySQL Performance-Problem bei Abfrage v. > 30 Feldern

Beitrag lesen

Hallo Steffen

"SELECT id FROM session_data WHERE session_id != '' AND angebots_id > 0 AND g=0 AND kw=0 AND ... AND g_nachname = ''"

Wie ungefähr ist die Tabellenstruktur?

id int(11) - auto_increment
session_id varchar(40)
angebots_id int(11)
g int(1)
kw int(2)
jahr int(4)
personen int(2)
anreisetag varchar(10)
g_v int(1)
g_id_1 varchar(4)
g_id_2 varchar(4)
g_id_3 varchar(4)
rrv int(1)
anrede varchar(10)
vorname varchar(40)
nachname varchar(40)
strasse varchar(40)
nr varchar(6)
plz varchar(5)
ort varchar(40)
a_a int(1)
a_anrede varchar(10)
a_vorname varchar(40)
a_nachname varchar(40)
a_strasse varchar(40)
a_nr varchar(6)
a_plz varchar(5)
a_ort varchar(40)
tel varchar(20)
fax varchar(20)
email varchar(60)
pass varchar(12)
pass_w varchar(12)
bemerkung text
g_anrede varchar(10)
g_vorname varchar(40)
g_nachname varchar(40)

Wenn ich mir so die Struktur und deine Frage so ansehe, dann würde ich generell den Aufbau ändern.

Ich vermute, du legst für jeden Nutzer einen Eintrag in dieser Tabelle an. Ein Teil der Nutzer speichert Daten, der Rest nicht. Eventuell werden auch Nutzer mehrfach eingetragen.

So wie du vorgehst wird deine Nutzertabelle so gut wie gar nicht genutzt.

Ich würde aus dieser Tabelle mindestens 2 machen.

Tabelle 1: session

angebot_id session_id nutzer_id

Tabelle 2: nutzerdaten

der Rest

das Autoincrementfeld entspricht der nutzer_id in der session-Tabelle

speichert ein nutzer nun Nutzerdaten erfolgt zusätzlich zum Speichern der Daten ein update der sessiontabelle, und die nutzer_id wird eingetragen.

Auf die Art und Weise kostet dir dein Select so gut wie gar keine Zeit und du vermeidest überflüssige Datensätze in der Nutzertabelle.

Viele Grüße

Antje