Announcement

Collapse
No announcement yet.

Stichwort Suche

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Stichwort Suche

    Hallo liebe Gemeinde,

    ich möchte eine Stichwortsuche einrichten mit einem Index
    Ich habe versucht

    EXPLAIN SELECT *
    FROM `test`
    WHERE Begr LIKE '%hallo%'

    in Begr sind meherer Wörter durch ein Semikolon getrennt
    Ich möchte diese suche über den Index laufen lassen, dass macht er leider nicht^^
    inzwischen habe ich herausgeunfden das kein % am anfang stehen darf, dann greift er auf den index zurück

    kann mir jemand helfen?


    danke =)

  • #2
    hmm select * from test where BEEGR LIKE '%KEY%'

    funkitoniert bei mir (mysql 5 Debian Linux Etch) perfekt

    Comment


    • #3
      natürlich funktioniert es, jedoch nicht über den index
      und ich möchte das über den index laufen haben^^

      Comment


      • #4
        Originally posted by heru View Post
        natürlich funktioniert es, jedoch nicht über den index
        und ich möchte das über den index laufen haben^^
        Sorry, hab geschlafen,

        Bist Du sicher, dass das Kosten sparen würde?

        Ich bin KEIN Mysql-Guru, aber die meisten Datenbanken und -Foren erklären einleuchtend, das Indixes auf Strings (varchars) nix an performance bringen und daher nie genutzt werden

        Will sagen, die DB-Engine ignoriert varchar indices automatich

        Comment


        • #5
          kein problem, bin froh das mir geholfen wird =)

          gibt es denn eine möglichkeit begr (sind ja meherer wörter drinne) aufzuspalten aber gleichzeitig auf alle zuzugreifen?
          so dass man das ohne % abfragen könnte?

          Comment


          • #6
            Hmm, schon mal drüber nachgedacht, eine gesonderte Suchwort-Tabelle zu erstellen, die du m:m mit der Tabelle 'Test' verknüpfst?

            Das wäre zwar komplizierter aber dafür performant ....

            Comment


            • #7
              darauf war meine frage abgezielt
              wie würde man den sowas realisieren?

              Comment


              • #8
                Code:
                Meta-Lang, bitte auf Mysql anpassen
                CREATE TABLE suchwort
                (
                  pk
                  suchwort character varying(25),
                )
                
                CREATE TABLE suchwort2test
                (
                  suchwortpk typeofpk,
                  testdatensatzpk typeofpk,
                )
                Wenn du dann Datensätze in nach einem Suchwort suchst, machst du das nem Select auf die Tabelle suchwort oder auf eine View Suchwort -> join ->suchwort2test -> join -> test

                Comment


                • #9
                  Such mal unter dem Stichwort "Volltextindex" in der MySQL-Doku.

                  Comment


                  • #10
                    Ich bin KEIN Mysql-Guru, aber die meisten Datenbanken und -Foren erklären einleuchtend, das Indixes auf Strings (varchars) nix an performance bringen und daher nie genutzt werden
                    Dann ist das, was die in den meisten Datenbankforen erzählen absolut falsch. Kannst Du mal ein Beispiel bringen?

                    Will sagen, die DB-Engine ignoriert varchar indices automatich
                    Wird das auch in den meisten Datenbankforen erzählt?
                    Weder mysql mssql, oracle, db2 ja nicht mal access ignorieren indices auf varchar Felder wenn sie verwendet werden können, und das ist der Punkt: Bei LIKE '%abc%' kann kein index verwendet werden (es sei den, er würde von Anfang bis Ende durchsucht werden, was je nach Statement auch deutlich langsamer sein kann als direkt einen FTS durchzuführen).

                    Hier noch ein kleines Beispiel zum Thema Indexverwendung (ist zwar Oracle, aber ich würd den rechten Arm von Bernhard verwetten, dass es unter mysql auch so läuft):

                    Code:
                    SQL> create table text as select a.* from all_objects a, all_objects b where rownum <= 1000000;
                    
                    Tabelle wurde erstellt.
                    
                    SQL> explain plan for select * from text where owner='abc';
                    SQL> select * from table(dbms_xplan.display);
                    Plan hash value: 738342525
                    
                    --------------------------------------------------------------------------
                    | Id  | Operation         | Name | Rows  | Bytes | Cost (%CPU)| Time     |
                    --------------------------------------------------------------------------
                    |   0 | SELECT STATEMENT  |      |   127 | 20066 |  3145   (1)| 00:00:38 |
                    |*  1 |  TABLE ACCESS FULL| TEXT |   127 | 20066 |  3145   (1)| 00:00:38 |
                    --------------------------------------------------------------------------
                    
                    SQL> create index text_ix on text(owner);
                    
                    Index wurde erstellt.
                    SQL> explain plan for select * from text where owner='abc';
                    
                    EXPLAIN PLAN ausgeführt.
                    
                    Abgelaufen: 00:00:00.11
                    SQL> select * from table(dbms_xplan.display);
                    Plan hash value: 662671706
                    
                    ---------------------------------------------------------------------------------------
                    | Id  | Operation                   | Name    | Rows  | Bytes | Cost (%CPU)| Time     |
                    ---------------------------------------------------------------------------------------
                    |   0 | SELECT STATEMENT            |         |     1 |   158 |     2   (0)| 00:00:01 |
                    |   1 |  TABLE ACCESS BY INDEX ROWID| TEXT    |     1 |   158 |     2   (0)| 00:00:01 |
                    |*  2 |   INDEX RANGE SCAN          | TEXT_IX |     1 |       |     2   (0)| 00:00:01 |
                    ---------------------------------------------------------------------------------------
                    Für das obige Problem werden, wie von Bernhard schon angesprochen, Volltextindices verwendet. Bei mysql sind die jedoch nur mit der MyIsam Engine verfügbar.

                    Dim
                    Zuletzt editiert von dimitri; 03.04.2009, 22:54.
                    Zitat Tom Kyte:
                    I have a simple philosophy when it comes to the Oracle Database: you can treat it as a black box and just stick data into it, or you can understand how it works and exploit it as a powerful computing environment.

                    Comment


                    • #11
                      vielen dank für die Hilfe =)
                      hab jetzt eine zweite Tabelle erstellt, die beiden verknüpgt und mach sozusagen iene TAG suche

                      vielen lieben dank

                      Comment

                      Working...
                      X