Nee, nee. Je berekent een hash waarde aan de hand van wat je dan ook wil opzoeken en deze hash waarde verwijst direct naar een entry in de index. Je hoeft die hash waarde niet op te zoeken in de index, het IS een pointer naar een positie in de index. Dat is juist de kracht van hash tabellen. In het ergste geval zijn er meerdere entries in de index met dezelfde hash waarde, die zitten dan in een linked listje of iets dergelijks.
[...]
Ordes en best cases in 1 zin

Ordes zijn bedoelt om een bovengrens aan te geven aan de mate van complexiteit. Best case ordes zijn dan ook onzin.
Met de ordes geef je aan hoe de hoeveelheid berekeningen groeit ten opzichte van een of meer variablen. Dus, als iets orde N tijd kost, dan zal het geval met N=200 twee keer zoveel tijd kosten als het geval met N=100. Als iets orde N*N tijd kost,
dan zal het geval met N=200 vier keer zoveel tijd kosten als het geval met N=100.
In mijn berekening wist ik niet zeker hoe de optimizer om zou gaan met een bepaalde constructie, dus heb ik twee mogelijkheden behandeld. Een van beide is waar (voor een bepaalde server), ofwel de best ofwel de worst case.
Daarnaast ben je een tabel aan het scannen voor meerdere waarden. Je weet pas of je klaar bent als je de complete tabel gehad hebt dus het scannen kost orde M. Het gebruik van de index maakt dus voor de orde niets uit en de verwachte zoektijd naar een enkel record M/N speelt al helemaal geen rol bij het orde verhaal.
Ik weet dat sommige mensen het scannen van een index Orde 1 geven omdat het zo stuk sneller is als het doorzoeken van de data. Echter, als je dat doet zul je ook andere processen die significant sneller zijn als het scannen van data Orde 1 moeten geven. Dit geldt dan ook voor het lijstje wat de dbengine genereert. Doe je het niet dan ben je appels met peren aan het vergelijken.
Die snap ik niet helemaal. Ik geef het berekenen van een hash waarde orde 1 tijd omdat dat gewoon een vaste hoeveelheid tijd kost die niet groeit naar mate M of N toenemen. Dat lijstje wat de database bij de subquery maakt is nou eenmaal M lang en daarin iets opzoeken kan alleen in orde 1 tijd als er een hash tabel van wordt gemaakt.
Dit soort opmerkingen is voor een hoop mensen een oproep om de database vol te gooien met indexen omdat een index aanmaken zo lekker simpel is en men de nadelen niet direct ziet. (Index corruptie, tragere updates e.d.)
Dus indexen zijn goed mits met mate gebruikt. (In dit geval zou ik waarschijnlijk sowieso een index op die foreign key zetten. Die zal wel vaker gebruikt worden)
Ok, ik wilde ook niet aangeven dat je alles moet indexeren. Maar deze kolom in deze tabel zou ik zeker doen. Daar zijn we het over eens.

Dus indexen of niet, ik begon dit omdat ik vind dat men bij het schrijven van queries meer moet nadenken over wat een optimizer ermee aan kan. En het is nou eenmaal zo dat onafhankelijke subqueries door een optimizer vaak effectiever worden geoptimaliseerd dan Outer Joins. Dus gegeven de keuze uit de twee opties in deze situatie zou ik altijd kiezen voor de versie met subquery (tenzij mySQL echt een hele belabberde optimizer heeft)
Ik zal het je nog sterker vertellen. Ik heb op m'n werk even zitten experimenteren. Weliswaar onder SqlServer, maar goed, zal wel ongeveer gelijk zijn. Die koos voor beide oplossingen min of meer hetzelfde plan van aanpak (je kunt in SqlServer kijken hoe hij de query gaat opbouwen):
[subquery]
1. table scan van bedrijven (of index als die bestaat)
2. table scan van forecast (of index als die bestaat)
3. haal de distinct waardes uit (2)
4. merge join (1) en (3)

5. haal de distinct waardes uit (4)
[join]
1. table scan van bedrijven (of index als die bestaat)
2. table scan van forecast (of index als die bestaat)
3. merge join (1) en (2)

4. filter de null waardes eruit
5. haal de distinct waardes uit (4)
Dus, eigenlijk doet ie voor beide queries hetzelfde, een merge join. Ik heb ook wat testdata zitten proberen, maar de performance van beide queries scheelt vrij weinig. Misschien dat de subquery merkbaar sneller is als er veel forecasts zijn per bedrijf, omdat stap 3 dan de merge join aanzienlijk kleiner maakt.
Hey, I came here to be drugged, electrocuted and probed, not insulted.