Struppi: index mit LIKE '%xxxx%'

Ich befürchte ich entwickel mir gerade einen Performancekiller, deshalb wollte ich die Meinung der DB Spezialisten hier mal hören bevor ich anfange.

also ich habe ein mySQL DB mit ca. 10,000 einträge, ein Index ist ein varchar, der einen von fünf verschiedene Strings beinhalten kann. Bisher alles keine Problem ein SELECT * FROM tbl WHERE index LIKE 'xxxx' (plus LIMIT) erfüllt den Zweck.

Nun wäre es aber evtl. nett, wenn die Indexspalte mehere Werte enthalten könnte. Mein Überlegung war diese werte mit Komma oder Leerzeichen zu separieren und dann mit LIKE '%xxx%' abzufragen.

Also in etwa so:

SPALTE_1 SPALTE_2 INDEX
 ....      ....    xxx, yyy
 ....      ....    xxx
 ....      ....    yyy
 ....      ....    zzz, yyy
 ....      ....    zzz, yyy, xxx
 ....      ....    zzz

Um dann mit:
SELECT * FROM tbl WHERE index LIKE '%xxx%'
oder
SELECT * FROM tbl WHERE index LIKE '%yyy%'

zu zugreifen.

Ist die Suche mit '%' auf 10,000 Datensätze (LIMIT sind max. 100) noch vertretbar?
Oder gibt es bessere Wege?

Struppi.

  1. Hi,

    Ich befürchte ich entwickel mir gerade einen Performancekiller,

    absolut zu Recht. Eine Seite des Suchbegriffes sollte immer ohne "%" enden, und von dieser Seite aus sollte die Spalte indiziert sein.

    also ich habe ein mySQL DB

    MySQL verfügt über Volltext-Indexe. Nutze diese Fähigkeit.

    Cheatah

    --
    X-Self-Code: sh:( fo:} ch:~ rl:° br:> n4:& ie:% mo:) va:) de:] zu:) fl:{ ss:) ls:~ js:|
    X-Self-Code-Url: http://emmanuel.dammerer.at/selfcode.html
    X-Will-Answer-Email: No
    X-Please-Search-Archive-First: Absolutely Yes
  2. yo,

    SELECT * FROM tbl WHERE index LIKE '%xxx%'
    SELECT * FROM tbl WHERE index LIKE '%yyy%'

    ein index wird generell über alle werte eine spalte erzeugt. solange du nur eine spalte abfragst, brauchst du nicht einen weiteren index. allerdings wird bei deinem konstrukt von LIKE '%xxx%' kein index benutzt werden, auch wenn er vorhanden ist. das liegt an dem führenden %, am ende ist ein % nicht so dramatisch.

    aber wie chetah dich schon hingewiesen hat, gibt es die möglichkeit der volltext suche.

    Ilja

  3. hi,

    also ich habe ein mySQL DB mit ca. 10,000 einträge, ein Index ist ein varchar, der einen von fünf verschiedene Strings beinhalten kann.

    warum ein VARCHAR, und kein SET?

    gruß,
    wahsaga

    --
    "Look, that's why there's rules, understand? So that you _think_ before you break 'em."
    1. also ich habe ein mySQL DB mit ca. 10,000 einträge, ein Index ist ein varchar, der einen von fünf verschiedene Strings beinhalten kann.

      warum ein VARCHAR, und kein SET?

      Wäre auch eine Option.
      Es ist halt bisher so, weil es sich so entwickelt hatte.

      Struppi.