Anzeige - [Hier werben / Mediadaten]
(?) Tags raten (?) (edit)
 
Reply to this topicStart new topicStart Poll
> MySQL-Abfrage optimieren
Logigoo
Geschrieben am: Mi 25.06.2008, 14:08
Report PostQuote Post

AyomRank 1
**

Gruppe: Member (inaktiv)
Beiträge: 3
Mitglied seit: 22.06.2008


Hallo,

mein problem ist das die SQL-Abfrage doch schon sehr langsam ist. Vielleicht könntet ihr mir ja Tipps geben wie ich die SQL-Abfrage bzw. den Index weiter optimieren könnte.
Ich kann mir nicht vorstellen das mit dem Datenbestand bereits die Grenze von MySQL erreicht ist biggrin.gif

In der Tabelle "tbl_suchindex" wird jedes einzelen Wort aus dem Titel in einer eigene Zeile gespeichert und in die Spalte "relevanz" wird dann z.b. 100 eingetragen um jeden einzelnen "tag" eine ensprechende Gewichtung zu geben. Die Resultaten ensprechen auch genau meine Vorstellungen nur leider macht mir die Geschwindigkeit probleme. Und geplant sind ca. 600.000 Artikel. Demnach würder die Tabelle "tbl_suchindex" noch größer werden und die Abfrage noch länger dauern sad.gif

Hier mal die Tabellen:

"tbl_artikel": ca. 280.000 Datensätze
id_artikel int(10) NOT NULL auto_increment (PRIMARY)
titel varchar(255) NOT NULL
aktiv tinyint(4) NOT NULL (INDEX)

"tbl_suchindex": ca. 3.800.000 Datensätze
id_artikel int(10) unsigned NOT NULL (INDEX)
tag varchar(150) default NULL (INDEX)
relevanz tinyint(1) unsigned NOT NULL
[/B]

Hier die eigentliche SQL-Abfrage (Dahinter steht eine Suchfunktion die nach Relevanz/Score sortiert)

CODE

SELECT
 sum(a.relevanz) as score,
 b.id_artikel,
 b.titel
FROM
 tbl_suchindex a
INNER JOIN
 tbl_artikel b ON (b.id_artikel=a.id_artikel)
WHERE
 a.tag IN ('suchwort1','suchwort2') AND
 b.aktiv = 1
GROUP BY
 a.id_artikel
ORDER BY
 score DESC,
 b.titel ASC
LIMIT 1000



Hier auch mal die Werte wenn ich es mit EXPLAIN ausführe.
Um es besser lesen zu können hab ich mal die einzelnen Spalten untereinander geschrieben.

id
1

1

select_type
SIMPLE
SIMPLE

table
a
b

type
ref
eq_ref

possible_keys
tag
PRIMARY

key
tag
PRIMARY

key_len
48
4

ref
const
dbxxx.a.id_artikel

rows
11172
1

Extra
Using where; Using temporary; Using filesort
Using where

Vielen Dank für eure Tipps
Top
PMEmail Poster
Top
 
 
jAuer
Jürgen Auer - freiberufl. Programmierer
#2 Geschrieben am: Mi 25.06.2008, 14:49 (+00:40)
Report PostQuote Post

AyomRank 9
Group Icon

Gruppe: Experten Entwicklung
Beiträge: 2433
Mitglied seit: 4.02.2006


Ein paar Anmerkungen:

1. Die Tabellen sind nicht sauber normalisiert, Tags sind hochgradig redundant. Rausziehen in eine Randtabelle, so daß die Verknüpfungstabelle nur noch Verweise und einen Primärschlüssel hat. Letzterer fehlt, das ist immer schlecht.

2. Die Sql-Abfrage würde auf dem MS-SqlServer und auf Access wegen Syntaxfehlern abgelehnt werden. Was mySql daraus macht, weiß ich nicht so genau. Jedenfalls wird effektiv nach b.id_artikel, b.titel gruppiert, das ist extrem teuer, weil es genügen würde, nach a.id_artikel zu gruppieren.

3. Die Gruppierung sollte nicht mit einer Tabellenverknüpfung kombiniert werden, das bläht die Zahl der Datensätze nur sinnfrei auf. Also die Gruppierung über eine sortierte Unterabfrage erledigen, die nur die benötigte Zahl von Zeilen zurückgibt, erst dann die weiteren Daten (Tag) zusammensammeln.

4. 1000 Datensätze sind unnötig viel. Wahrscheinlich werden ohnehin nur sehr viel weniger angezeigt, also kann man das auch entsprechend einschränken.

Wahrscheinlich hilft das bereits dramatisch. Sollte das nichts helfen, könnte man sich auch Gedanken darüber machen, die Spitzenwerte (die sich ja nicht allzu häufig ändern) nächtlich zu ermitteln und diese in einer Tabelle (Detailtabelle, die Tags mit sich selbst verknüpft) zu speichern.


--------------------
Web-Anwendung 3.0: Ein Online-Kalender für Termine vieler Filialen.

server-daten - die Single-Data-Solution: Web-Datenbanken als Online - CRM - Lösung.
Ihre Geschäftsprozesse entscheiden, was Ihre Online-Datenbank macht. Sie konzentrieren sich auf Ihr Kerngeschäft - Ihre Datenbank funktioniert.
Top
PMEmail PosterUsers Website
Top
 
Logigoo
#3 Geschrieben am: Mi 25.06.2008, 15:41 (+00:52)
Report PostQuote Post

AyomRank 1
**

Gruppe: Member (inaktiv)
Beiträge: 3
Mitglied seit: 22.06.2008


Vielen Dank für die schnelle Antwort.

Zu 1:
Meinen Sie einen Tabellenaufbau in folgender Form?

"tbl_artikel_suche_tag"
id_tag (PRIMARY)
tag

"tbl_artikel_suche_index"
id_index (PRIMARY)
id_artikel (INDEX)
id_tag (INDEX)
relevanz


Zu 2:
Könnten Sie mir bitte sagen wo bei der SQL-Abfrage der Syntaxfehlern auftreten würde?

Zu Punkt 3 und 4 komme ich später nochmal drauf zurück wink.gif
Top
PMEmail Poster
Top
 
Basti08
#4 Geschrieben am: Mi 25.06.2008, 16:27 (+00:45)
Report PostQuote Post

AyomRank 4
********

Gruppe: Member (aktiv)
Beiträge: 57
Mitglied seit: 29.11.2007


Mit fällt da gerade noch ein das man auch bei Abfragen die oft auftreten Prozeduren schreiben kann, macht die Sache bedeutent schneller!

Grüße


--------------------
Mach dich schlau...!
Suche Linkpartner im Bereich Rätsel! Einfach PM!
Top
PMEmail Poster
Top
 
jAuer
Jürgen Auer - freiberufl. Programmierer
#5 Geschrieben am: Mi 25.06.2008, 16:35 (+00:07)
Report PostQuote Post

AyomRank 9
Group Icon

Gruppe: Experten Entwicklung
Beiträge: 2433
Mitglied seit: 4.02.2006


QUOTE (Logigoo @ Mi 25.06.2008, 15:41)
Zu 1:
Meinen Sie einen Tabellenaufbau in folgender Form?

"tbl_artikel_suche_tag"
id_tag  (PRIMARY)
tag

"tbl_artikel_suche_index"
id_index (PRIMARY)
id_artikel (INDEX)
id_tag (INDEX)
relevanz


Im Prinzip ja, allerdings würde ich die tbl_artikel_suche_tag direkt als tbl_tag benennen, die zweite Grundtabelle heißt ja schon tbl_artikel, die dritte tbl_suchindex = tbl_artikel_suche_index.

QUOTE (Logigoo @ Mi 25.06.2008, 15:41)
Könnten Sie mir bitte sagen wo bei der SQL-Abfrage der Syntaxfehlern auftreten würde?


Mein MS-SqlServer sagt:

QUOTE
Meldung 8120, Ebene 16, Status 1, Zeile 2
Column 'tbl_artikel.id_artikel' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause.


Das gehört zum Thema Group By.

mySql fördert da leider eine extrem schlampige Syntax, die im Standard-Sql gar nicht akzeptiert wird.


--------------------
Web-Anwendung 3.0: Ein Online-Kalender für Termine vieler Filialen.

server-daten - die Single-Data-Solution: Web-Datenbanken als Online - CRM - Lösung.
Ihre Geschäftsprozesse entscheiden, was Ihre Online-Datenbank macht. Sie konzentrieren sich auf Ihr Kerngeschäft - Ihre Datenbank funktioniert.
Top
PMEmail PosterUsers Website
Top
 
FD
#6 Geschrieben am: Do 26.06.2008, 09:02 (+16:26)
Report PostQuote Post

AyomRank 2
****

Gruppe: Member (aktiv)
Beiträge: 20
Mitglied seit: 23.06.2008


Ich würde die Tabellen ändern wie es @jAuer beschrieben hat und zusätzlich eine View anlegen die du gleichzeitig Sortierst mit deinen Order By und auf dieser View mit den Limit gehst, da ansonsten in deiner Abfrage dein Limit keine Performance bring da du Sortierst und Mysql erst das Gesamtergebnis sortieren muss und dann mit Limit die ersten 1000 Sätze ausgibt.

Erfolgt die Sortierung mithilfe eines Indexes (in deinen Fall nicht) ist der Limit befehl sehr schnell.

Gruß
Frank
Top
PMEmail PosterUsers Website
Top
 
Logigoo
#7 Geschrieben am: Do 26.06.2008, 12:41 (+03:38)
Report PostQuote Post

AyomRank 1
**

Gruppe: Member (inaktiv)
Beiträge: 3
Mitglied seit: 22.06.2008


Vielen Dank für die Hilfreichen Antworten.

Ich werde mich jetzt mal mit den Unterabfragen von MySQL beschäftigen um die Tabellenstruktur wie von @jAuer beschrieben zu realisieren.
Bisher hatte ich mit Unterabfragen noch nie was gemacht.
Top
PMEmail Poster
Top
 
Thema wird von 0 Benutzer(n) gelesen (0 Gäste und 0 anonyme Benutzer)
0 Mitglieder:
Trackback-Url: http://www.ayom.com/track/t/25104

Topic Options Reply to this topicStart new topicStart Poll

 


> Ähnliche Themen
Lost connection to MySQL cr4m0 125 4 So 23.11.2008, 14:31
MySQL Frage G.P. 104 2 Mo 17.11.2008, 15:59
SQL Abfrage für OS Commerce Siegfried_D 125 5 Do 13.11.2008, 22:58
Suche Freelancer: Ajax, XML, PHP, MySQL omc 320 3 Mi 12.11.2008, 18:22
Einbinden vonn RSS feeds in Typo3 / MYSQL e-card 10955 5 Di 4.11.2008, 18:36
MySql Frage - ID Ändern EuD 122 2 Di 4.11.2008, 11:09
mysql query vereinfachen Big Rob 164 5 Mo 3.11.2008, 22:40
mysql Dump Städte pl_90 163 2 So 26.10.2008, 01:13
MySQL Befehl G.P. 173 5 Fr 24.10.2008, 15:58
Lösung für: Content Slider-Java Script-PHP-MySql Antoine Johannes 336 2 Fr 26.09.2008, 12:54




Anzeige - [Hier werben / Mediadaten]



Anzeigen


[Hier werben / Mediadaten]