phpbar.de logo

Mailinglisten-Archive

performance -> SQL-Optimierung

performance -> SQL-Optimierung

Michael Donning donning at informenta.de
Mit Jan 22 09:28:40 CET 2003


Hallo Wolf(gang),

mein e-mail Programm hat es mal wieder versemmelt und Dir die Antwort
zunächst als Pers.-Mail anstatt per Liste zukommen lassen.
Damit die Liste auch etwas davon hat habe ich unsere bisherigen Mails unten
an den Text angehängt.

> -----Original Message-----
> From: Wolfgang Steinhauer [mailto:wolf at earthway.org]
> Das habe ich gemacht. Als Ergebnis kam das:
>
> table                                       |   type  |  possible_keys  |
> key            | key_len   |   ref      |  rows | Extra
> insekt_adress_to_arten           | ALL   |        NULL       |   NULL
> | NULL    | NULL  | 656    |
> insekt_adress_to_bundesland |   ref     | bundesland_id  | bundesland_id |
> 4       | const    |   4      |where used
> insekt_adress                         |  ALL   |    PRIMARY   |       NULL
> |  NULL  | NULL | 270     |

aufgrund des Umbruches extrem schwer zu lesen. Aber eine Richtung ist
erkennbar.
>
> Wieso sagt er beim ersten Table possible_keys = NULL ?
> Der Table hat drei Felder, einen auto_increment mit primary-key uns zwei
> indexen.......
Evtl. sollte man die Bedingung zur Auswahl der Zeilen der ersten Tabelle
nicht in den left join sondern in das Where-Statement packen, das macht das
Ganze dann auch übersichtlicher.

Für weitere Diskussionen ist es evtl. sinnvoll, daß Du die (evtl gekürzten)
Create-Table/Index statements der Tabellenstrukturen postest.

>
> Was hat es bei MySql eigentlich mit "Kardinalitaet" auf sich ?
>
Ja, gibt es :). Kardinalität bewertet ja die Qualität eines Indexes. Viele
gleiche Werte in einem Index geben eine niedrige Kardinalität und verringern
die Wahrscheinlichkeit, daß der Index für eine Query von MySql verwendet
wird. Z.B. Ein Index auf ein Feld, daß nur Ja/Nein Werte (1/0) enthält, wird
wahrscheinlich nie verwendet. Es gibt auch einen Aufruf, um die
Index-Statistiken für eine Tabelle zu aktualisieren (weiß ich aber nicht
auswendig -> siehe Handbuch).

Gruss, Michael Donning

----------------------------------------------------------------------------
----------------------------------------------
so hier wie oben angedroht die Wiederholung für die Liste:
meine erste Antwort:

Hallo Wolf(gang),

> -----Original Message-----
> From: Wolfgang Steinhauer [mailto:wolf at earthway.org]
> habe derzeit ein kleines Problem mit einen SQL-Statement ueber drei Tables
> mit sechs Vergleichen:
>...

Stell mal das Wörtchen "Explain" oder "Describe" vor Dein Statement. Dann
zeigt MySql seinen Suchfindungsweg an. Insbesondere welche Indizes benutzt
(und welche nicht benutzt) werden.

Generell kann man sagen auf jedes Feld auf das man einen Vergleich anstellt
ist es u.U. sinnvoll einen Index zu setzen evtl. auch als Komibination von
Feldern.

Tödlich für die Performance allerdings sind Abfragen wie "%wert%". Denn dort
greift kein Index. Evtl. sollte man dort überlegen nur am Feldbeginn zu
suchen ( like '$eingabe%") und die komplett freie Suche %wert% nur bei
Nichterfolg nachzuschalten.

Gruss Michael Donning

----------------------------

und Deine Antwort (komplett):

Hallo Michael,

> Stell mal das Wörtchen "Explain" oder "Describe" vor Dein Statement. Dann
> zeigt MySql seinen Suchfindungsweg an. Insbesondere welche Indizes benutzt
> (und welche nicht benutzt) werden.

Das habe ich gemacht. Als Ergebnis kam das:

table                                       |   type  |  possible_keys  |
key            | key_len   |   ref      |  rows | Extra
insekt_adress_to_arten           | ALL   |        NULL       |   NULL
| NULL    | NULL  | 656    |
insekt_adress_to_bundesland |   ref     | bundesland_id  | bundesland_id |
4       | const    |   4      |where used
insekt_adress                         |  ALL   |    PRIMARY   |       NULL
|  NULL  | NULL | 270     |

Wieso sagt er beim ersten Table possible_keys = NULL ?
Der Table hat drei Felder, einen auto_increment mit primary-key uns zwei
indexen.......

Was hat es bei MySql eigentlich mit "Kardinalitaet" auf sich ?

> Generell kann man sagen auf jedes Feld auf das man einen Vergleich
anstellt
> ist es u.U. sinnvoll einen Index zu setzen evtl. auch als Komibination von
> Feldern.

Ich setze generell einen Index auf alle Felder in denen Gesucht werden
soll......

> Tödlich für die Performance allerdings sind Abfragen wie "%wert%". Denn
dort
> greift kein Index. Evtl. sollte man dort überlegen nur am Feldbeginn zu
> suchen ( like '$eingabe%") und die komplett freie Suche %wert% nur bei
> Nichterfolg nachzuschalten.

Das ist mir schon klar.... nur leider geht es in diesem Fall nicht
anders....
Ich kann nicht alle Regierungsbezirke und Staedte von Deutschland,
Oesterreich, Schweiz, Holland, Luxemburg und Lichtenstein in Tables
packen......
Also werden sie einfach in einem Textfeld gespeichert - mit dem Nachteil der
unterschiedlichen Schreibweise....

hast Du sonst noch irgendwelche Ideen dazu ?

Liebe Gruesse,
wolf

-- 
Infos zur Mailingliste, zur Teilnahme und zum An- und Abmelden unter
-->>  http://www.4t2.com/mysql 


php::bar PHP Wiki   -   Listenarchive