Datenbankabfrage Optimieren

nchristoph

Erfahrenes Mitglied
Hallo,

ich bin gerade beim optimieren und beschleunigen meiner Suchmaschine.

Ich hab jetzt die SQL Abfrage mit PHP soweit wie möglich verbessert.

Was kann ich noch machen, damit die Suchabfrage bei 4400 Einträge schneller ist.

Momentan braucht das Ausgeben der Ergebnis ca. 5 - 10 Sekunden.

Hier mal mein Table

SQL:
CREATE TABLE IF NOT EXISTS `suchmaschine` (
  `ID` int(255) NOT NULL AUTO_INCREMENT,
  `Holzart` varchar(255) NOT NULL,
  `Klasse` varchar(20) NOT NULL,
  `Trockenheit` varchar(20) NOT NULL,
  `Partie` varchar(20) NOT NULL,
  `Starke` varchar(20) NOT NULL,
  `Pfad` text NOT NULL,
  `Datum` datetime NOT NULL,
  `anderungsdatum` datetime NOT NULL,
  PRIMARY KEY (`ID`),
  KEY `ID` (`ID`),
  FULLTEXT KEY `partie` (`Partie`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=4399 ;

und meine Abfrage

PHP:
SELECT
				ID,
                Holzart,
				Klasse,
				Trockenheit,
				Partie,
				Starke,
				Pfad,
				DATE_FORMAT(Datum,'%d.%m.%Y')AS Datum,
				DATE_FORMAT(anderungsdatum,'%d.%m.%Y')AS anderungsdatum
            FROM
                suchmaschine
            WHERE
                Holzart LIKE '%" . mysql_real_escape_string(htmlentities($_POST['suchbegriff'],ENT_QUOTES,'UTF-8')) . "%' OR
				Partie LIKE '%" . mysql_real_escape_string(htmlentities($_POST['suchbegriff'],ENT_QUOTES,'UTF-8')) . "%'
			ORDER BY
				Holzart, Starke, Klasse, Partie  ASC

Kann mir da wer helfen?

Grüsse
 
Zuletzt bearbeitet von einem Moderator:
Mach einen FULLTEXT auf Partie und Holzart
Suchen kannst du dann über MATCH

SQL:
-- Index setzen
ALTER TABLE suchmaschine  ADD FULLTEXT INDEX idx_suchmaschine_search_1 (holzart, partie);

-- und mit MATCH suchen.
SELECT
	...
FROM
	suchmaschine
WHERE
	-- der Suchbegriff wird hier ohne die % verwenden!
	MATCH (holzart, partie) AGAINST ('suchbegriff')

Am MATCH kann man ncoh einges schrauben
MySQL-Volltextsuche
MySQL-Volltextsuche feineinstellen


Ansonsten min. ein Index über beide Felder und dann dein SQL.
 
Zuletzt bearbeitet von einem Moderator:
Danke erstmal Yaslaw.

Mit dem Index habe ich schon einen kleinen Geschwindigkeitszuwachs bemerkt.

Mit Match kann ich aber keine Autovervollständigung durchführen wenn ich das richtig erkenne.

Also ich gebe 2 - 3 Ziffern ein und der Server fängt zu suchen an und schlägt mir dann alle Pakete mit den Ziffern vor. So habe ich das Momentan zumindest, deswegen Like.

Gibt es dafür mit Match eine Möglichkeit?
 
Habs noch nie angewendet - sollte jedoch gemäss Doku das sein.
in Boolesche Volltextsuche
SQL:
MATCH (holzart, partie) AGAINST ('MeinSuchwort*' IN BOOLEAN MODE)

Beachte, dass MATCH erst ab 4 Zeichen greifft (ausser du stellst das um)
MySQL-Volltextsuche feineinstellen
Die minimalen und maximalen Längen von zu indizierenden Wörtern werden mit den Systemvariablen ft_min_word_len und ft_max_word_len definiert. (Siehe auch Abschnitt 5.2.2, „Server-Systemvariablen“.) Die standardmäßige Mindestlänge beträgt vier Zeichen, die vorgabeseitige Höchstlänge hängt von der Version ab. Wenn Sie einen der Werte ändern, müssen Sie ihre FULLTEXT-Indizes neu erstellen. Wünschen Sie beispielsweise, dass Wörter mit drei Zeichen durchsucht werden können sollen, dann können Sie die Variable ft_min_word_len umstellen, indem Sie die folgenden Zeilen in eine Optionsdatei schreiben:

Code:
[ mysqld]
ft_min_word_len=3


Danach müssen Sie den Server neu starten und die FULLTEXT-Indizes neu erstellen. Beachten Sie insbesondere die Anmerkungen zu myisamchk in der Anleitung, die auf diese Liste folgt.
 
Zuletzt bearbeitet von einem Moderator:
Danke Yaslaw,

Das mit MATCH und den 4 Zeichen habe ich schon gelesen und umgestellt. Ist ja ne Netzwerk Geschichte.

Funktioniert jetzt um Längen besser. Hab jetzt auch zusätzlich noch das ausführen auf 3 Zeichen limitiert also strlen($suchbegriff) >= 3.

Die Abfrage benötigt jetzt ca. 1 Sekunde +/-, im Vergleich zu vorher 5 - 10 Sekunden.

Danke für die schnelle Hilfe.
 

Neue Beiträge

Zurück