Schrift
[thread]3702[/thread]

Wie genau die Indizes setzen...?

Leser: 1


<< |< 1 2 3 >| >> 25 Einträge, 3 Seiten
olruebe01
 2006-07-12 07:01
#34532 #34532
User since
2006-01-19
192 Artikel
BenutzerIn
[default_avatar]
Hallo mal wieder,

ich bin noch bei meinen ersten SQL-Erfahrungen und bitte Euch gleich, Eure Antworten so zu schreibe, als wäre ich drei Jahre alt :-)

Ich habe eine DB mit etwa 20 Spalten. Inhalt sind Produktdaten, die mir per CSV-Datei zur Verfügung gestellt werden und regelmäßig upgedatet werden (sollen).

Es gibt also Spalten mit Produktbezeichnung, Kurzbeschreibung, Langbeschreibung, Preis, Verfügbarkeit, Kategorie, Bild-URL, und und und...

Suchen möchte ich jetzt nach einem Begriff, der in den Feldern Bezeichnung, kurzbeschreibung, Langbeschreibung und Keywords vorkommen kann. In dem Feld Bild-URL werde ich nicht suchen.

Sehe ich das nun richtig, dass ich auf die Felder, in denen ich suchen will (und nur auf diese) einen Index setzten sollte?

In allen Feldern gab es Duplikate. Wenn ich das richtig sehe, konnte ich aus diesem Grund keinen Primary legen. (Richtig?)
Ich habe also noch eine Spalte hinzugefügt, die einfach durchnummeriert wird und diese Spalte als Primary festgelegt. Wenn ich das richtig verstanden habe, war das so richtig. (Richtig?)

Ich hatte nun etwa 150.000 Produkte (=Zeilen) und alles war prima. Abfrage dauerte um 0.025 Sekunden oder so.
Die Abfrage war eine LIKE '%SUCHBEGRIFF%'. Habe nun gelesen, dass dies wohl etwas Leistung schluckt aber gibt es eine Alternative, wenn ich Suchbegriffe MITTEN in TExten suchen will?

Nun habe ich inzwischen etwa 500.000 Produkte angelegt. Eine Suchabfrage dauert nun weit über 30 Sekunden (Hilfe!!)

Wenn ich zwar nicht nach dem Preis suchen möchte aber die Suchergebnisse nach dem Preis sortieren lassen möchte, muss das Preis auch einen Index bekommen?

Habe ich da etwas falsch gemacht mit meinen Indizes?
MartinR
 2006-07-12 11:50
#34533 #34533
User since
2004-06-17
305 Artikel
BenutzerIn
[default_avatar]
Hi,

hast Du schon mal in der MySQL-Doku nachgelesen?
GwenDragon
 2006-07-12 13:00
#34534 #34534
User since
2005-01-17
14533 Artikel
Admin1
[Homepage]
user image
Verstehe ich das richtig? Du hast eine Tabelle, in die alle Daten drin sind?

Normalerweise sollte man eine Datenbank normalisieren. Das heißt, häufig wiederkehrende Daten in eine eigene Tabelle und nur mit einem Index drauf verweisen.

DB normaliseren - Tipps:
http://www.bytegeist.de/mySQL/Normalisieren-Beispiel.htm
http://www.zdnet.de/builder/architect/0,39023548,20000756,00.htm
http://www.akademie.de/program....ur.html\n\n

<!--EDIT|GwenDragon|1152695329-->
die Drachin, Gwendolyn


Unterschiedliche Perl-Versionen auf Windows (fast wie perlbrew) • Meine Perl-Artikel

pq
 2006-07-12 13:28
#34535 #34535
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
wobei es nicht immer gut für die suchperformance ist, eine tabelle zu
normalisieren. aber erstmal indizes anlegen ist die beste idee.
die kardinalität eines index sollte hoch sein. die bekommst du
angezeigt, wenn du show indexes from table aufrufst.
beispielsweise hat ein index auf eine spalte mit nur 3 möglichen werten
eine sehr geringe kardinalität.
auch ist zu beachten, dass MySQL nur auf einem index arbeiten kann.
explain select ... zeigt dir, welchen index MySQL benutzen würde und
wieviel zeilen dann noch manuell durchsucht werden müssen.
kombinierte indizes können sich lohnen. du musst halt wissen,
wonach am meisten gesucht wird.
und wenn das alles nichts hilft, steig auf eine suchmaschine um.
datenbanken sind nur begrenzt als hochleistungs-suchmaschinen
tauglich.

bzgl. like "%foo%": du kannst in mySQL einen volltextindex anlegen.
Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live. -- Damian Conway in "Perl Best Practices"
lesen: Wiki:Wie frage ich & perlintro Wiki:brian's Leitfaden für jedes Perl-Problem
olruebe01
 2006-07-12 19:58
#34536 #34536
User since
2006-01-19
192 Artikel
BenutzerIn
[default_avatar]
@ MartinR: Die Doku ist absolut untauglich für 3-Jährige :-) Habe nachgesehen aber nach dem 4 Wort, das ich nicht kannte /verstanden habe, wusste ich da auch nicht weiter...

@pq: Wenn MySWL nur auf einem Index arbeiten kann, sollte ich dann mehrere anlegen?
Zum Volltextindex: Auf welche Spalte sollte ich den legen? Auf alle 3?
Auf eine Scuhmaschine umsteigen: Wie jetzt? Ist das eine Möglichkeit unter MySQL oder ist das was ganz anderes?

@ GwenDragon: Wie soll ich häufig wiederkehrende Daten in eine extra Tabelle legen? Wie meinst Du das? Soll ich alle PC's in eine Tabelle tun und alle Brotbackautomaten in eine andere? Wenn ja: Was mache ich, wenn jemand nach dem Gerät "CT-21" sucht und anhand dieses Suchbegriffs nicht klar ist, ob es ein PC oder ein Brotbackautomat ist? Aber ich werde mir die Links gleich mal ansehen...

Ich habe im Moment 590.000 Einträge. Ich habe einen PRIMARY auf "laufendeNummer" (Kardinalität 590.000). DIes ist die einzige Spalte, die wirklich einmalige Inhalte hat.
Ich habe je einen Index auf Bezeichnung, Kurzbeschreibung, langbeschreibung und Preis. Karinalität ist jeweils "keine". Wie bekomme ich die den auf einen hohen Wert???

Habe mal folgende Abfragen gemacht:
SELECT *
FROM `Produktdaten`
WHERE 1
Abfrage dauerte 0.03 Sekunden (TOLL!!!)

Dann diese:
SELECT *
FROM `Produktdaten`
WHERE Bezeichnung LIKE '%fahrrad%'
Abfrage dauerte 48 Sekunden

Liegt das Problem an der Kardinalität? Wenn die Hoch sein muss, gibt es doch wohl ein Problem mit den Indizes, oder?
betterworld
 2006-07-12 20:12
#34537 #34537
User since
2003-08-21
2613 Artikel
ModeratorIn

user image
[quote=olruebe01,12.07.2006, 17:58]SELECT *
FROM `Produktdaten`
WHERE 1
Abfrage dauerte 0.03 Sekunden (TOLL!!!)

Dann diese:
SELECT *
FROM `Produktdaten`
WHERE Bezeichnung LIKE '%fahrrad%'
Abfrage dauerte 48 Sekunden[/quote]
Das finde ich eigentlich fast ein bisschen unlogisch, weil ja in beiden Fällen die ganze Tabelle durchsucht werden muss.
dominicn
 2006-07-12 20:16
#34538 #34538
User since
2003-08-08
327 Artikel
BenutzerIn
[default_avatar]
[quote=betterworld,12.07.2006, 18:12]Das finde ich eigentlich fast ein bisschen unlogisch, weil ja in beiden Fällen die ganze Tabelle durchsucht werden muss.[/quote]
Naja, nicht ganz. Das erste Statement gibt einfach den kompletten Tabelleninhalt zurück, beim zweiten muss bei jedem Datensatz überprüft werden, ob irgendwo in der Bezeichnung ein bestimmter String auftaucht. Das ist schon wesentlich aufwändiger. 48 Sekunden klingt natürlich viel, da können vielleicht ein paar Datenbankexperten sagen, wo man verbessern sollte.
renee
 2006-07-12 20:19
#34539 #34539
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
jein, bei der zweiten Version muss halt noch die Bezeichnung durchgeschaut werden... LIKE bremst immer ziemlich aus.
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
olruebe01
 2006-07-12 20:22
#34540 #34540
User since
2006-01-19
192 Artikel
BenutzerIn
[default_avatar]
Habe mir gerade Gwens ersten Link-Tipp angesehen. Der ist Prima. Genau für 3-jährige gemacht. Erstmal solte man diesen Link JEDEM Anfänger empfehlen!!!!

Daraus stellt sich mir aber folgende Frage: Macht es sinn, wenn ich meine Tabelle aufteile in 4 Tabellen:
1: Tabelle: Artikelnummer und Bezeichnung
2: Tabelle: Artikelnummer und Kurzbeschreibung
3: Tabelle: Artikelnummer und Langbeschreibung
4: Tabelle: Artikelnummer und sonstige Daten (Preis, Lieferzeit, wo erhältlich,...)
Ich würde dann meine Abfrage in den ersten 3 Tabellen durchführen. Allerdings müsste ich jede Abfrage in allen 3 Tabelle durchführen, da ich nicht weiß, ob der Suchbegriff in der Artikelbezeichnung, der Kurz- oder Langbeschreibung vorkommt...

Ist das Sinnvoll?
pq
 2006-07-12 20:26
#34541 #34541
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
[quote=olruebe01,12.07.2006, 17:58]@pq: Wenn MySWL nur auf einem Index arbeiten kann, sollte ich dann mehrere anlegen?
Zum Volltextindex: Auf welche Spalte sollte ich den legen? Auf alle 3?
Auf eine Scuhmaschine umsteigen: Wie jetzt? Ist das eine Möglichkeit unter MySQL oder ist das was ganz anderes?[/quote]
MySQL kann nur einen index pro SELECT und tabelle benutzen.
natürlich kannst und sollst du mehrere indizes anlegen.
wie gesagt, benutze EXPLAIN und spiel damit ein bißchen rum.
volltextindex gehört auf die spalte, auf die du volltextsuchen machst.
wenn alle drei spalten text beinhalten, ist das natürlich ungünstig.
eine suchmaschine ist was ganz anderes. wie gesagt sind datenbanken
nur begrenzt als suchmaschinen tauglich.
ich kann die leider keine bestimmte suchmaschine empfehlen; auf meiner arbeit
benutzen wir seit kurzem eine firmenintern entwickelte, und damit
sind unsere suchen durchschnittlich doppelt so schnell geworden (und
wir haben maschinen eingespart).\n\n

<!--EDIT|pq|1152721618-->
Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live. -- Damian Conway in "Perl Best Practices"
lesen: Wiki:Wie frage ich & perlintro Wiki:brian's Leitfaden für jedes Perl-Problem
<< |< 1 2 3 >| >> 25 Einträge, 3 Seiten



View all threads created 2006-07-12 07:01.