» »

[mySQL] Kaj je hitrejše?

[mySQL] Kaj je hitrejše?

moj_nick ::

1. situacija:
table_name = situacija1
+------+---------+
| type | data    |
+------+---------+
|    1 | lorem   |
|    2 | ipsum   |
|    1 | dolor   |
|    2 | sit     |
+------+---------+

SELECT * FROM situacija1 WHERE type='2';



2. situacija:
table_name = situacija2_1
+---------+
| data    |
+---------+
| lorem   |
| dolor   |
+---------+

table_name = situacija2_2
+---------+
| data    |
+---------+
| ipsum   |
| sit     |
+---------+

SELECT * FROM situacija2_2;

Kateri ukaz se bo prej izvršil, če bi v končni fazi imel po nekaj sto različnih type-ov in bi bil vsak prisoten nekaj sto-krat (v drugi situaciji bi potemtakem imel 100 tabel, vsaka s 100 vnosi), tabela pa bi bila široka ~5 stolpcev. Query bo vedno klical samo en type.
110111001001010001010000

borchi ::

bi reku, da je hitrejši drugi način. sam logike take rešitve pa ne vidim?!

kako boš pa vedu v kateri tabeli imaš določen type?
l'jga

Vesoljc ::

> kako boš pa vedu v kateri tabeli imaš določen type?
2_1, 2_2?
Abnormal behavior of abnormal brain makes me normal...

AndrejS ::

Mislim da ne bo nekakšne velike razlike... samo indekse za prvi primer je treba pametno nastavit

Vesoljc ::

yup, batching!!!
Abnormal behavior of abnormal brain makes me normal...

bzp ::

K sm bil jest v podobni dilemi, sem nekje v mysql manualu zasledil da sicer je st. tabel v bazi lahko precej veliko (nikjer nasel podatka kaksna je zgornja meja), ampak tega ne priporocajo pa tudi preglednost se izgubi. Tko da IMHO prva varianta boljs. Je pa res da query po veliki tabeli s pogojem je ziher pocasnejsi kot query po manjsi tabeli + brez pogoja.

AndrejS ::

Sicer pa mySQL itak ni za velike količine podatkov. Tako da je boljše po kakšni drugi bazi posečt.

moj_nick ::

No, če je dobra za slo-tech, bo tudi zame ;)
110111001001010001010000

BigWhale ::

Jaz bi to popravil... Ce je MySQL dober za Slashdot... :P

Ziga Dolhar ::

> No, če je dobra za slo-tech, bo tudi zame ;)

Sej rajtam da mysql ni dovolj dober za slotech ... :)
https://dolhar.si/

mercutio ::

Definitivno prva varianta, index na prvi stolpec pa je. Z drugo varianto boš imel samo težave.

frudi ::

o mysql sicer nimam pojma (kako je z execution plani, clustered indexi in podobnimi forami), ampak predstavljam si, da bi drugi scenarij sicer lahko bil hitrejši za posamezna branja, ob velikem številu branj pa skoraj zagotovo prvi.
vsaj v ms sql so moje izkušnje take, da so naslednja branja iz iste tabele (pač z drugačnim where pogojem) hitrejša kot pa vsakokratno branje iz druge tabele. sploh pa ob primerno poindeksirani tabeli velikost ne igra tako velike vloge.
pa že iz stališča vzdrževanja je prva opcija bistveno privlačnejša (100 tabel... kje boš pa našel bedaka, ki ti bo pisal skripte za to? se ti zmeša od copy-pastanja :D)
1ACDoHVj3wn7N4EMpGVU4YGLR9HTfkNhTd... in case I've written something useful :)

moj_nick ::

Definitivno prva varianta, index na prvi stolpec pa je. Z drugo varianto boš imel samo težave.

Če bi query za situacija1 izgledal takole:
SELECT * FROM situacija1 WHERE type = 15 AND data = 'neka_vrednost';

...naj poindexiram oba stolpca (seveda bi v situaciji obstajal še tretji stolpec s pomembnimi podatki)?
110111001001010001010000

CCfly ::

No, če je dobra za slo-tech, bo tudi zame ;)
Slo-Tech je na Postgres-u, Wikipedia na primer, pa čisto lepo pelje z MySQL-om.
"My goodness, we forgot generics!" -- Danny Kalev

dmok ::

Če bi query za situacija1 izgledal takole:
SELECT * FROM situacija1 WHERE type = 15 AND data = 'neka_vrednost';
...naj poindexiram oba stolpca (seveda bi v situaciji obstajal še tretji stolpec s pomembnimi podatki)?


Seveda. Pa če je kombinacija type - data unikatna naj bo indeks obvezno unikaten. Če potrebuješ podatke iz tretjega stolpca potem je varianta tudi ta, da dodaš v indeks še tretji stolpec in če je optimizer dovolj inteligenten bo v tem primeru vrnil podatke kar iz indeksa. Torej, če je indeks po kolonah type, data, stolpec3 in je poizvedba:

SELECT stolpec3 FROM situacija1 WHERE type = 15 AND data = 'neka_vrednost'

potem lahko optimizer uporabi omenjeni index in vrne vrednost stolpec3 kar iz indeksa - tabele se sploh ne dotakne.

Po mojem mnenju pa se definitivno ne splača particionirati tabele po koloni type, če imaš za vsak type po nekaj sto različnih vrednosti kolone data.

lp, d.


Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

MS Access (strani: 1 2 )

Oddelek: Programiranje
647076 (5134) travica
»

sql-t stored procedure

Oddelek: Programiranje
10997 (864) detroit
»

SELECT iz dveh tabel (MySQL)

Oddelek: Izdelava spletišč
111234 (1115) Borci
»

PHP razvrščanje rezultatov po abecedi

Oddelek: Programiranje
81305 (1162) OwcA
»

PHP in mySQL

Oddelek: Programiranje
241835 (1543) rasta

Več podobnih tem