Forenindex » Programmierung/Entwicklung » PHP und MySQL » order-by Effizienz

order-by Effizienz

habicht
Beiträge gesamt: 3

8. Feb 2009, 14:20
Bewertung:

gelesen: 1691

Beitrag als Lesezeichen
Hallo,

mich beschäftigt folgende Frage:

angenommen ich habe eine MySQL Tabelle mit 100.000 Zeilen. Die erste Spalte ist "id INT PRIMARY KEY", die zweite " x INT UNIQUE" oder ähnlich. Auf die zweite Spalte "x" finden zum einen regelmäßig "ORDER BY x"-Abfragen statt, zum anderen werden abundzu x-Werte eingefügt, bzw. ganze x-Wert-Blöcke verschoben (z.B. x=x+1). Wie gestalte/indiziere ich die Tabelle am effizientesten?

Vielen Dank

order-by Effizienz

oesi50
  
Beiträge gesamt: 2315

9. Feb 2009, 11:32
Bewertung:

gelesen: 1667

Beitrag als Lesezeichen
hallo habicht

schalte mal delay_key_write ein, besonders für häufige INSERT und UPDATE Operationen.

Code
ALTER TABLE deine_tabelle  DELAY_KEY_WRITE =1 


Damit werden die Keys nicht zwangsweise auf die Festplatte geschrieben, sondern erst wenn der Mysql-Server "eine Hand frei" hat.

Außerdem solltest du darauf achten, dass sämtliche keys in den RAM passen.
key_buffer_size = ??? (mindestens so groß wie die Summer der Größe aller .MYI Dateien)
dafür aber
sort_buffer_size klein halten (z.B. 250KB)

zusätzlich noch
key_cache_division_limit = 60


Grüße Oesi
Ich weiß, dass ich nicht weiß... (Sokrates)

(Dieser Beitrag wurde von oesi50 am 9. Feb 2009, 15:29 geändert)

order-by Effizienz

habicht
Beiträge gesamt: 3

9. Feb 2009, 11:51
Bewertung:

gelesen: 1661

Beitrag als Lesezeichen
Hallo oesi50,

vielen Dank für Deine Antwort!

Ich habe festgestellt, dass x=x+1 u.ä. Operationen auf UNIQUE-Spalten nicht funktionieren, weshalb ich UNIQUE entfernt habe. Ich denke, dass jegliche Sortierfunktionen jetzt wesentlich ineffizienter ausgeführt werden als vorher. Hab ich da jetzt einfach Pech oder kann ich die Spaltendefinition noch intelligenter gestalten?

order-by Effizienz

oesi50
  
Beiträge gesamt: 2315

9. Feb 2009, 13:06
Bewertung:

gelesen: 1648

Beitrag als Lesezeichen
ich hab das mal schnell mit 100.000 DS getestet.

Abfrage:

Code
SELECT SQL_NO_CACHE * 
FROM test_update_key
ORDER BY xid
LIMIT 100;


0,0012 sek. mit Index
0,0824 sek. ohne Index

Code
SELECT *  
FROM test_update_key
ORDER BY xid
LIMIT 100;


0,0012 sek. 1. Aufruf mit Cache und Index
0.0004 sek. jeder weitere Aufruf mit Cache


Code
UPDATE test_update_key SET xid=xid+1 

1,9216 sek. mit Index
1,8669 sek. mit Index(delay key write)
1,1588 sek. ohne Index



Code
UPDATE test_update_key SET xid=xid+1 WHERE xid > 10000 


0,2979 sek. ohne Index
0,0053 sek. mit Index
0,0050 sek. mit Index(delay key write)



Code
Name  	Typ  	Kardinalität  	Feld 
PRIMARY PRIMARY 100011 id
xid INDEX 10001 xid



Grüße Oesi
Ich weiß, dass ich nicht weiß... (Sokrates)

(Dieser Beitrag wurde von oesi50 am 9. Feb 2009, 13:17 geändert)

order-by Effizienz

habicht
Beiträge gesamt: 3

9. Feb 2009, 15:05
Bewertung:

gelesen: 1623

Beitrag als Lesezeichen
Oesi, ich bin beeindruckt.

Index mit DELAY_KEY_WRITE scheint ein guter Schachzug zu sein.

Vielen Dank für die Mühe