hallo
martin hat eh das wesentliche schon beschrieben.
indizes sind z.b. unter oracle als b*trees ausgelegt. die haben den vorteil, dass sie auch bei wirklich grossen tabellen immer schön performant sind. die grösste unserer tabellen hat knapp 100 mio einträge. eine suche nach einem sauber indizierten feld dauert trotzdem weit unter einer sekunde. bei der suche nach einem unique key ist die suche nur unwesentlich langsamer als bei einer kleinen tabelle.
das wichtigste mittel zur performanceoptimierung ist, darauf zu achten, dass die daten gut indizierbar sind. und dann natürlich sinnvolle indizes anlegen. da gibt es einige grundregeln zu beachten:
null-values werden üblicherweise nicht indiziert. eine suche nach „where column is null“ endet daher in einem full-table-scann, egal ob index vorhanden ist oder nicht.
für ein physisches db-model hat das ziemliche auswirkungen. angenommen, du speicherst z.b. nachrichten. du willst standardmässig alle ungelesenen nachrichten anzeigen. wenn du nun ein feld „gelesen date“ hast und fragst „where gelesen is null“ bekommst du zwar korrekte ergebnisse, die aber nur langsam. sinnvoller kann es sein, für ungelesene nachrichten einen wert in ferner zukunft zu nehmen (z.b. den 1.1.3000). oder gleich ein eigenes statusfeld, dass gelesen ja/nein abbildet. da du von vielen range-scanns auf das gelesenstatus-feld ausgehen kannst, ist es oft vorteilhaft, den wert NULL für false anzunehmen: dich interessieren nur die true-werte und null wird nicht indiziert => dein index beinhaltet nur die true-werte und der range-scann wird sehr flott sein.
like-abfragen auf textfelder können nur dann den index nutzen, wenn der platzhalter „%“ nicht an erster stelle kommt. vermeide also im db-design felder, in denen völlig frei gesucht werden kann (oder nimm einen volltext-index, der aber anders abgefragt werden muss).
wenn du case-insensitiv suchen willst (also gross-kleinschreibung ignorieren), brauchst du entweder einen function-based-index, der etwas langsamer als normale indizes ist. oder du braucht ein spezielles suchfeld, dass du in deiner tabelle extra mitführst und dass die daten optimiert für die suche abspeichert.
generell ist es immer notwendig, sich zu überlegen, über welche pfade du auf die daten zugreifen wirst - wie also die suchen aussehen werden. im nachhinein zu optimieren ist oft sehr mühsam.
lg
erwin