SELFPHP: Version 5.8.2 Befehlsreferenz - Tutorial – Kochbuch – Forum für PHP Einsteiger und professionelle Entwickler

SELFPHP


Professional CronJob-Service

Suche



CronJob-Service    
bei SELFPHP mit ...



 + minütlichen Aufrufen
 + eigenem Crontab Eintrag
 + unbegrenzten CronJobs
 + Statistiken
 + Beispielaufrufen
 + Control-Bereich

Führen Sie mit den CronJobs von SELFPHP zeitgesteuert Programme auf Ihrem Server aus. Weitere Infos



:: Buchempfehlung ::

Das Zend Framework

Das Zend Framework zur Buchempfehlung
 

:: Anbieterverzeichnis ::

Globale Branchen

Informieren Sie sich über ausgewählte Unternehmen im Anbieterverzeichnis von SELFPHP  

 

:: Newsletter ::

Abonnieren Sie hier den kostenlosen SELFPHP Newsletter!

Vorname: 
Name:
E-Mail:
 
 

Zurück   PHP Forum > SELFPHP > MySQLi/PDO/(MySQL)

MySQLi/PDO/(MySQL) Anfänger, Fortgeschrittene oder Experten können hier Fragen und Probleme rund um MySQLi/PDO/(MySQL) diskutieren

Antwort
 
Themen-Optionen Ansicht
  #1  
Alt 12.01.2011, 10:47:29
Kukulkan Kukulkan ist offline
Anfänger
 
Registriert seit: Nov 2007
Beiträge: 35
Welchen Index verwenden

Hallo,

ich habe eine einfache Frage, deren Antwort aber wohl doch nicht so einfach ist. Hier das bestehende Tabellenschema:

Nutzdatenzeugs
ZuordnungsID
Datum

Jetzt gibt es auf diese Tabelle viele Abfragen im Stil von
SELECT * FROM Tabelle WHERE ZuordnungsID = 5 AND Datum > '2011-01-02 22:34:56'

In ZuordnungsID gibt es nur wenig Variation (zB 30 verschiedene Nummern). Es gibt aber viele 100'000 Einträge in der Tabelle.

Wie sollte jetzt der Index am besten angelegt werden? Lege ich besser zwei Indexe auf die beiden Spalten an oder besser einen kombinierten Index auf die beiden? Spielt die Reihenfolge beim Anlegen eigentlich eine Rolle?

ALTER TABLE `Tabelle` ADD INDEX `idx_DateID`(`Datum`, `ZuordnungsID`);
oder
ALTER TABLE `Tabelle` ADD INDEX `idx_DateID`(`ZuordnungsID`, `Datum`);

Klappt das auch, wenn ich (wie im Beispiel-Select oben) nicht ein festes Datum suche sondern zB alle, die neuer als ein bestimmtes Datum sind?

Ist da ein Unterschied? Hängt das auch an der angegebenen Reihenfolge im SELECT?

Ein kleiner DESC Test in MySQL brachte, dass bei zwei separaten Indexen wohl nur einer verwendet wird (beide waren möglich, aber nur der Datumsindex mit 4 Byte wurde verwendet). Wenn ich einen kombinierten Index verwende, scheint dieser auch direkt verwendet zu werden (8 Byte). Ich trau der Sache aber nicht...

Kann mir jemand auf die Sprünge helfen?

Kukulkan
Mit Zitat antworten
  #2  
Alt 12.01.2011, 11:00:01
thomas_w thomas_w ist offline
Junior Member
 
Registriert seit: Aug 2010
Alter: 14
Beiträge: 395
AW: Welchen Index verwenden

Zitat:
Zitat von Kukulkan Beitrag anzeigen
Jetzt gibt es auf diese Tabelle viele Abfragen im Stil von
SELECT * FROM Tabelle WHERE ZuordnungsID = 5 AND Datum > '2011-01-02 22:34:56'

Spielt die Reihenfolge beim Anlegen eigentlich eine Rolle?

a) ALTER TABLE `Tabelle` ADD INDEX `idx_DateID`(`Datum`, `ZuordnungsID`);
oder
b) ALTER TABLE `Tabelle` ADD INDEX `idx_DateID`(`ZuordnungsID`, `Datum`);
Die Reihenfolge der Spalten spielt eine wichtige Rolle. Wenn die Eindeutigkeit (Kardinalität oder Selektivität) der Werte bei der Spalte ZuordnungsID gering ist ( ca. 30 verschiedene Werte wie Du sagst), dann ist der Index A) der bessere für diese Abfrage, aber auch der Index B) kann sinnvoll sein.

Ob und wie MySQL einen Index verwendet, läßt sich mit EXPLAIN ermitteln.

Beispiel EXPLAIN..

Code:
mysql> EXPLAIN SELECT * FROM kunde;
+----+-------------+-------+--------+---------------+------+---------+------+------+---------------------+
| id | select_type | table | type   | possible_keys | key  | key_len | ref  | rows | Extra               |
+----+-------------+-------+--------+---------------+------+---------+------+------+---------------------+
|  1 | SIMPLE      | kunde | system | NULL          | NULL | NULL    | NULL | 0    | const row not found |
+----+-------------+-------+--------+---------------+------+---------+------+------+---------------------+
1 row in set (0.19 sec)

mysql>
Bitte sauber formatieren, sonst kann man ihn nicht richtig lesen.

Grüße
Thomas
__________________
Die SQL-Backstube
Bietet Rezepte, Lösungen und ausführliche Beispiele rund um gesundes SQL und zufriedene Datenbanken.
Mit Zitat antworten
  #3  
Alt 12.01.2011, 12:44:57
Kukulkan Kukulkan ist offline
Anfänger
 
Registriert seit: Nov 2007
Beiträge: 35
AW: Welchen Index verwenden

Hallo,

Danke für die Antwort. Das mit dem EXPLAIN hab ich schon gemacht (hab versehentlich DESC geschrieben). Es scheint so, als würde der Index verwendet.

Wie ist das eigentlich, wenn der SELECT so lautet und ZuordnungsID ein VARCHAR ist?

Code:
SELECT * FROM Tabelle WHERE Datum > '2011-01-02 22:34:56' AND ZuordnungsID LIKE 'DE%'
Wird der mit
Code:
ALTER TABLE `Tabelle` ADD INDEX `idx_DateID`(`Datum`, `ZuordnungsID`);
angelegte Index auch für die ZuordnungsID verwendet? Ich hab da zweifel, weil ja bereits das erste Kriterium (Datum) nicht ein fester Vergleich ist sondern ein > (grösser als).

Sollte der Index dann besser andersrum angelegt werden (zuerst ZuordnungsID)? Leider trifft das aber nur auf einen kleinen Bruchteil aller mit DE beginnenden Datensätze zu (Datum ist definitiv wichtiger).

Kukulkan
Mit Zitat antworten
  #4  
Alt 12.01.2011, 12:54:27
thomas_w thomas_w ist offline
Junior Member
 
Registriert seit: Aug 2010
Alter: 14
Beiträge: 395
AW: Welchen Index verwenden

Zitat:
Zitat von Kukulkan Beitrag anzeigen
Wie ist das eigentlich, wenn der SELECT so lautet und ZuordnungsID ein VARCHAR ist?

Code:
SELECT * FROM Tabelle WHERE Datum > '2011-01-02 22:34:56' AND ZuordnungsID LIKE 'DE%'
Wird der mit
Code:
ALTER TABLE `Tabelle` ADD INDEX `idx_DateID`(`Datum`, `ZuordnungsID`);
angelegte Index auch für die ZuordnungsID verwendet? Ich hab da zweifel, weil ja bereits das erste Kriterium (Datum) nicht ein fester Vergleich ist sondern ein > (grösser als).

Sollte der Index dann besser andersrum angelegt werden (zuerst ZuordnungsID)? Leider trifft das aber nur auf einen kleinen Bruchteil aller mit DE beginnenden Datensätze zu (Datum ist definitiv wichtiger).

Kukulkan
Am einfachsten ist es, wenn Du beide Indices (mit verschiedenen Namen) anlegst und den EXPLAIN mit den genannten Varianten ausführt. Dann wird klar, ob und wie wlecher Index verwendet wird. Mach einfach eine kleine Testserie.

Bei
Code:
SELECT * FROM Tabelle WHERE Datum > '2011-01-02 22:34:56' AND ZuordnungsID LIKE 'DE%'
In diesem Fall kann auch für ZuordnungsID (VARCHAR) ein Index verwendet werden. Allerdings sind INT besser für Indices geeignet als VARCHAR, da VARCHAR zumeist mehr Platz benötigen.

Grüße
Thomas
__________________
Die SQL-Backstube
Bietet Rezepte, Lösungen und ausführliche Beispiele rund um gesundes SQL und zufriedene Datenbanken.
Mit Zitat antworten
  #5  
Alt 12.01.2011, 13:33:22
Kukulkan Kukulkan ist offline
Anfänger
 
Registriert seit: Nov 2007
Beiträge: 35
AW: Welchen Index verwenden

Ok, vielen Dank. Das hat mir gut weiter geholfen.

Grüße,

Kukulkan
Mit Zitat antworten
Antwort

Stichworte
index, mysql


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 
Themen-Optionen
Ansicht

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind aus.
[IMG] Code ist aus.
HTML-Code ist aus.

Gehe zu

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Notice: undefined index Leyyin PHP Grundlagen 9 07.07.2010 12:59:19
DB Warnung mehr als ein INDEX abidmon MySQLi/PDO/(MySQL) 0 02.03.2008 10:56:37
Problem mit Index ksticker PHP Grundlagen 3 01.02.2008 12:28:24
phpMyAdmin: combined index hinzufügen lod_bodo MySQLi/PDO/(MySQL) 3 03.09.2007 13:30:03
Doppelter Index nach Änderung ? lod_bodo MySQLi/PDO/(MySQL) 7 07.03.2006 21:50:45


Alle Zeitangaben in WEZ +2. Es ist jetzt 11:11:26 Uhr.


Powered by vBulletin® Version 3.8.3 (Deutsch)
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.


© 2001-2024 E-Mail SELFPHP OHG, info@selfphp.deImpressumKontakt