Hoewel je hier op zich gelijk mee hebt, geldt natuurlijk wel: hoe kleiner de records, hoe meer er met 1 disk-read (of ram-access) kunnen worden ingelezen.
Sterker nog; veel databases slaan een dergelijke tinyint gewoon op als 32 of 64 bits integer omdat 't voor de CPU sneller is met 'native' integers te werken.
Aangezien de specifieke database al genoemd is - MySQL - heeft deze opmerking weinig nut
Maar eerlijk gezegd geloof ik je statement ook niet. Van zowel MySQL als PostgreSQL weet ik in ieder geval zeker dat ze gewoon zoveel bits gebruiken als nodig is voor het datatype en niet onnodig bytes verspillen.
Of ze diezelfde representatie ook in RAM (altijd) zo klein houden weet ik niet, het zou me inderdaad niet verbazen als e.e.a. daar wel naar native ints wordt geconverteerd.
In dit verhaal is met name MySQL's 3-byte grote mediumint veel interessanter. Daar is vziw in programmeertalen en cpu's doorgaans geen ondersteuning voor, dus dat moet dan sowieso geconverteerd worden naar 4-byte integers. Voor smallint is normaliter in ieder geval nog een 'short' beschikbaar (en voor tinyint de 'byte').
Overigens is PostgreSQL (en ik) het verder wel met je eens:
The type integer is the common choice, as it offers the best balance between range, storage size, and performance. The smallint type is generally only used if disk space is at a premium. The bigint type is designed to be used when the range of the integer type is insufficient.
Hoedanook, terugkerend naar de originele vraag:
Veld1 kan met zowel integer als smallint.
De integer zal qua rekenwerk wat vlotter zijn, de smallint levert kleinere on-disk data op (zowel voor dat als voor indexen).
Veld2 kan met de standaardopties float en decimal, maar eventueel ook met 1000 vermenigvuldigd worden end an ook als integer.
Float is waarschijnlijk het eenvoudigst en efficienter met rekenen (er is native cpu-ondersteuning voor) dan de decimal. Het verliest wel enige preciesie, omdat de float-representatie domweg niet alle mogelijke cijfers kan opslaan. Echter door dat weer af te ronden, zal je daar in de praktijk wellicht weinig van merken. Qua opslag lijkt het erop dat ze beide in 4 bytes passen.
Decimal heeft als voordeel dat het gegarandeerd precies is. Maar er is geen native cpu-ondersteuning voor, dus de kans is groot dat het tijdens je programmeerwerk alsnog in float (of double) wordt omgezet. Qua opslag is
waarschijnlijk ook 4 bytes. Wel heeft dat wat complexere conversie dan domweg de vier bytes van een float opslaan, dus het is ook hier trager.
Smallint en gewone integer kunnen ook. Door het met 1000 te vermenigvuldigen eindig je dan met waardes 0-500. Verder gelden dan dezelfde argumenten als bij Veld1.
Kortom;
Als opslagruimte je drijfveer is: gebruik voor beide smallint.
Als performance belangrijk is: gebruik voor veld1 integer en voor veld2 float.
Als preciesie echt belangrijk is: gebruik voor veld1 een integer-smaak en voor veld2 decimal (let wel op hoe je er dan in je code mee omgaat).