/ / Trieda úložiska SQLite A efektívnosť získavania - sql, sqlite, sqlite3

Trieda ukladania SQLite A účinnosť vyhľadávania - sql, sqlite, sqlite3

Povedzme, že mám jednu tabuľku, ktorá je referenčnou tabuľkou (tabuľka sa iba konzultuje, nie aktualizuje).

napríklad tabuľková schéma:

CREATE TABLE countries(
zip_code INTEGER PRIMARY KEY,
name TEXT)

Chcem zvýšiť rýchlosť získavania údajov. Teraz používam index na namestĺpec, ale chcem ísť ďalej ...

Zmena schémy tabuľky:

CREATE TABLE countries(
zip_code INT PRIMARY KEY,
name CHAR(200))

opakujte, že som upravil dátový typ stĺpcov, aby som špecifikoval a pevná veľkosť pre každý stĺpec, teda pevná veľkosť pre celý riadok.

Je to správny predpoklad? Mysli na to riadky s pevnou veľkosťou sú načítateľné rýchlejšie ako riadky dynamickej veľkosti v SQLite DBMS.

Inšpirujem sa z iných DBMS (MySQL), ktoré sa načítajú riadky statickej veľkosti rýchlejšie ako riadky dynamickej veľkosti

odpovede:

3 pre odpoveď č. 1

Opravujem túto odpoveď tak, aby bola relevantná pre SQLite. Je prijatá, takže ju nemôžem odstrániť.

Nemyslím si, že uloženie 200 bajtov za každýMeno sa chystá urýchliť váš dopyt. Vo väčšine databáz stačí iba znásobiť objem ukladaných údajov - pretože názvy sú kratšie. V SQLite je to ne-op. SQLite ukladá všetky reťazce znakov ako text; nevkladá hodnoty medzerami, ako to robia iné databázy.

Nie som dôverne oboznámený s vnútornými silami SQLite. Ale databázy (vrátane SQLite) ukladajú záznamy dátové stránky, Spravujú sa prostredníctvom vyrovnávacieho mechanizmu. A indexy identifikujú záznam podľa stránky, na ktorej sú. Celá dátová stránka sa načíta.

Vo väčšine databáz sa stĺpec deklaruje ako name(200) by pravdepodobne stratilo veľa miesta. Zvýšilo by to veľkosť záznamu a malo by to tieto účinky:

  • Na jednu stránku je možné uložiť menej záznamov.
  • Pri následnom načítaní je menej pravdepodobné, že nájde stránku záznamu v pamäti cache.
  • Čítanie celej tabuľky pravdepodobne zaberie oveľa viac miesta v pamäti.
  • Čítanie riadku vyžaduje čítanie a spracovanie ďalších bajtov.

V SQLite to neplatí, pretože SQLite jednoducho ignoruje dĺžku a nevkladá hodnotu medzerami.

To, čo chcete urobiť, nie je dobrý nápad vo väčšine databáz a nemá žiadny účinok v SQLite. Odporúčam vyhnúť sa takémuto prístupu. Index by mal byť dostatočný.