Hallo,
Ich muss mich entschuldigen, ich habe deine Antwort neben dem Gespräch mit Ekki komplett überschaut.
sowas kommt vor. Es gibt schlimmeres.
Das Problem war ein falscher Typecast von meiner Seite.
Mein Beitrag sollte Dir eigentlich sagen, dass ein CAST im SQL-Dialekt von MySQL gar nicht notwendig ist.
Vielen Dank aber für den Aufwand den du betrieben hast um mir eine Antwort zu geben!
Darum noch ein Frage: Gibt es eine Möglichkeit, eine Query der folgenden (sehr langsamen) Form bei gleicher Funktionalität zu optimieren?
SELECT Titel,Untertitel,Reihe,Urheber,Herausgeber,Medienart,stichwortliste.Id
FROM medienliste,stichwortliste
WHERE medienliste.Id=stichworliste.Id
GROUP BY stichwortliste.Id
HAVING
SUM(Stichwort='schweiz')>=1
AND SUM(Stichwort='demografie')>=1
ORDER BY
IFNULL((Titel = 'schweiz demografie'),0) DESC,
IFNULL((Untertitel = 'schweiz demografie'),0) DESC,
IFNULL((Reihe = 'schweiz demografie'),0) DESC,
IFNULL(CAST(Titel LIKE '%schweiz%' AS UNSIGNED) + CAST(Titel LIKE '%demografie%' AS UNSIGNED),0) DESC,
IFNULL(CAST(Untertitel LIKE '%schweiz%' AS UNSIGNED) + CAST(Untertitel LIKE '%demografie%' AS UNSIGNED),0) DESC,
IFNULL(CAST(Reihe LIKE '%schweiz%' AS UNSIGNED) + CAST(Reihe LIKE '%demografie%' AS UNSIGNED),0) DESC,
Titel,Untertitel
LIMIT 0,10
ich schreibe mal (für mich) übersichtlicher mit expliziter Join-Syntax und verzichte auf das Sortieren und Limitieren der Ergebnismenge.
~~~sql
SELECT
m.Titel,
m.Untertitel,
m.Reihe,
m.Urheber,
m.Herausgeber,
m.Medienart,
s.Id,
FROM
medienliste m
INNER JOIN
stichwortliste s
ON
m.Id = s.Id
GROUP BY
s.Id
HAVING
SUM(s.Stichwort='schweiz') >= 1
AND SUM(s.Stichwort='demografie') >= 1
a) allein das ist schon teuer, weil HAVING erst auf die gesamte Ergebnismenge angewandt wird und nicht vorher einschränkend wirken kann.
b) Bist Du Dir ganz sicher, dass die Werte in den Spalten
- Titel,
- Untertitel,
- Reihe,
- Urheber,
- Herausgeber,
- Medienart
zu gleicher Id in der Tabelle stichwortliste alle gleich sind?
Wenn nein, liefert diese Abfrage in den von mir genannten Spalten nicht vorhersagbare Werte. Ich glaube kaum, dass Du an nicht vorhersagbaren Werten interessiert bist, wenn Du anschließend nach deren Inhalten sortieren willst.
GROUP BY und nicht aggregierte Spalten, eines meiner Lieblingsthemen.
Momentan wäre es daher hilfreich, ein paar Datensätze beider Tabellen zur Verfügung zu haben, um das Verhalten nachvollziehen zu können und zielführende Hinweise geben zu können.
Berechnete Spalten für die Sortierung sind teuer und bei Dir müssen sie für alle Datensätze berechnet werden, weil Du die Anzahl der Datensätze nicht durch eine "echte" WHERE-Klausel einschränkst. Deine WHERE-Klausel ist nur ein implizite Join-Schreibweise. Kann man zuerst die Datensatzanzahl einschränken, die betrachtet werden muss und nur für diese die berechneten Spalten berechnen lassen, so kann dies deutlichen Performancegewinn bringen. Wichtig sind natürlich auch die Indexe und die Frage, ob sie verwendet werden (können). Das und vieles andere sagt Dir EXPLAIN.
Freundliche Grüße
Vinzenz