Re(11): mysql und PHP (wieder)
Geizhals » Forum » Programmierung » mysql und PHP (wieder) (30 Beiträge, 180 Mal gelesen) Top-100 | Fresh-100
Du bist nicht angemeldet. [ Login/Registrieren ]
.  Re: mysql und PHP (wieder)  (Somnatic am 07.08.2005, 18:07:37)
.. Vom Autor zurückgezogen oder Autor hat seine Registrierung nicht bestätigt  (_E_r_I_c_H_ am 07.08.2005, 18:08:12)
.. Vom Autor zurückgezogen oder Autor hat seine Registrierung nicht bestätigt  (_E_r_I_c_H_ am 07.08.2005, 18:19:12)
...  Re(3): mysql und PHP (wieder)  (Somnatic am 07.08.2005, 18:20:41)
.... Vom Autor zurückgezogen oder Autor hat seine Registrierung nicht bestätigt  (_E_r_I_c_H_ am 07.08.2005, 18:23:04)
.....  Re(5): mysql und PHP (wieder)  (Somnatic am 07.08.2005, 18:28:25)
...... Vom Autor zurückgezogen oder Autor hat seine Registrierung nicht bestätigt  (_E_r_I_c_H_ am 07.08.2005, 18:30:06)
.. Vom Autor zurückgezogen oder Autor hat seine Registrierung nicht bestätigt  (_E_r_I_c_H_ am 07.08.2005, 21:08:18)
..  Re(2): mysql und PHP (wieder)  (Ingenico am 08.08.2005, 20:06:16)
....  Re(4): mysql und PHP (wieder)  (Ingenico am 09.08.2005, 19:45:24)
......  Re(6): mysql und PHP (wieder)  (Ingenico am 10.08.2005, 09:37:13)
........  Re(8): mysql und PHP (wieder)  (Ingenico am 10.08.2005, 18:14:40)
..........  Re(10): mysql und PHP (wieder)  (Ingenico am 10.08.2005, 18:37:29)
...........
Re(11): mysql und PHP (wieder)
10.08.2005, 18:43:20
Sorry...

Ich habe eine Tabelle BUBU angelegt
=# CREATE TABLE bubu ( a varchar(20) );
CREATE TABLE

Habe einen Wert reingelegt:
x=# INSERT INTO bubu values('jsfkf');
INSERT 17145 1

Einen Function based Index(upper) angelegt:
x=# CREATE INDEX xxx on bubu(upper(a));
CREATE INDEX

Laß mir anzeigen, wie der Optimizer das SELECT auflöst
x=# EXPLAIN SELECT * from bubu where upper(a) = 'X';
                     QUERY PLAN
-----------------------------------------------------
Seq Scan on bubu  (cost=0.00..1.01 rows=1 width=24)
   Filter: (upper((a)::text) = 'X'::text)
(2 Zeilen)

Aaah - Sequentieller Scan, net Index. Logisch, da sowenig Werte drin sind.
Also hab ich ihm verboten, sequentielle Scans durchzuführen

x=# set enable_seqscan = off;
SET

Und nochmal die Query
x=# EXPLAIN SELECT * from bubu where upper(a) = 'X';
                           QUERY PLAN
-----------------------------------------------------------------
Index Scan using xxx on bubu  (cost=0.00..4.68 rows=1 width=24)
   Index Cond: (upper((a)::text) = 'X'::text)
(2 Zeilen)

Wir sehen - er macht einen INDEXscan.
Klappt dasselbe mit Like ?

x=# EXPLAIN SELECT * from bubu where upper(a) like 'X%';
                                     QUERY PLAN
------------------------------------------------------------------------------------
Index Scan using xxx on bubu  (cost=0.00..4.68 rows=1 width=24)
   Index Cond: ((upper((a)::text) >= 'X'::text) AND (upper((a)::text) < 'Y'::text))
   Filter: (upper((a)::text) ~~ 'X%'::text)
(3 Zeilen)

Ja.

Aus Sicht des RDBMS ist ein funtion-based Index primitiv zu implementieren, wenn du schon indizes hast...

Denn anstatt im Index die Werte mit Pointer auf die Rows wegzuspeichern, muß er nur noch einen Zwischenschritt machen: Anstatt die Werte selbst zu speichern, speichert er die Funktionsergebnisse der Werte.

Daher dauert das Indizieren länger, und bei jedem Insert muß er zusätzlich die Funktionsergebnisse berechnen... Macht also Primär bei Tabellen mit viel mehr Queries als Inserts Sinn - aber das gilt ja für alle Indizes. Deine DB wird's wohl intern genauso lösen.

Antworten PM Alle Chronologisch Zum Vorgänger
 
Melden nicht möglich
............  Re(12): mysql und PHP (wieder)  (Ingenico am 10.08.2005, 18:52:45)
...  Re(3): mysql und PHP (wieder)  (Rennegade am 10.08.2005, 10:16:10)
....  Re(4): mysql und PHP (wieder)  (Ingenico am 10.08.2005, 11:45:39)
.....  Re(5): mysql und PHP (wieder)  (Rennegade am 10.08.2005, 11:55:17)
......  Re(6): mysql und PHP (wieder)  (Da Horstl am 10.08.2005, 12:24:31)
......  Re(6): mysql und PHP (wieder)  (Ingenico am 10.08.2005, 12:50:16)
 

Dieses Forum ist eine frei zugängliche Diskussionsplattform.
Der Betreiber übernimmt keine Verantwortung für den Inhalt der Beiträge und behält sich das Recht vor, Beiträge mit rechtswidrigem oder anstößigem Inhalt zu löschen.
Datenschutzerklärung