mysql und PHP (wieder)
Geizhals » Forum » Programmierung » mysql und PHP (wieder) (30 Beiträge, 170 Mal gelesen) Top-100 | Fresh-100
Du bist nicht angemeldet. [ Login/Registrieren ]
...........
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 Übersicht Chronologisch Zum Vorgänger
 
Melden nicht möglich
 

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