L
Logigoo
Guest
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
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
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
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
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
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