|
PHP PHP aplikacije, Smarty, PEAR |
|
Alati teme | Način prikaza |
18. 03. 2006. | #11 | |
Ivan Dilber
Sir Write-a-Lot
|
Citat:
1. ima uvek sve podatke u memoriji (indexi se keshiraju, ali su ipak na disku) 2. radi kao hash tabela, a mysql indexi su valjda B-stabla. Hash na osnovu kljuca racuna formulom direktno poziciju podatka i pristupa mu direktno(ili u par koraka kod kolizija), dok stablo zahteva spustanje po cvorovima... medjutim priznajem da nisam imao pojma da je tolika razlika.. postoji jos jedan problem kod mysql join-ova, kad ima puno podataka u tabela nad kojima se radi join. Ako ih pustis na 2 tabele od kojih jedna ima npr. 20 miliona recorda mozes slobodno da zaboravis na server, mrtav je, sa ili bez indexa. Pravio sam neke spajdere koji skupljaju uzasno mnogo podataka, i morali smo da splitujemo tabele svakih milion, milion i po recorda, jer cela baza postane uzasno spora...
__________________
Leadership is the art of getting people to want to do what you know must be done. |
|
18. 03. 2006. | #12 |
Boris
Grand Master
Datum učlanjenja: 01.12.2005
Lokacija: Novi Sad
Poruke: 775
Hvala: 5
156 "Hvala" u 2 poruka
|
Apropo indeksa
Kod mene je isti slucaj kao i kod ivanhoe da se index na polju category_id ne koristi, ali obratite paznju sta se desava u sledecim situacijama. Kôd:
mysql> create index test on master (category_id,master_id); Query OK, 40000 rows affected (0.31 sec) Records: 40000 Duplicates: 0 Warnings: 0 mysql> explain SELECT m.*, c.description FROM master m LEFT JOIN categories c ON m.category_id = c.category_id; +----+-------------+-------+--------+---------------+---------+---------+--------------------+-------+-------------+ | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | +----+-------------+-------+--------+---------------+---------+---------+--------------------+-------+-------------+ | 1 | SIMPLE | m | index | NULL | test | 9 | NULL | 40000 | Using index | | 1 | SIMPLE | c | eq_ref | PRIMARY | PRIMARY | 4 | news.m.category_id | 1 | | +----+-------------+-------+--------+---------------+---------+---------+--------------------+-------+-------------+ 2 rows in set (0.01 sec) mysql> SELECT m.*, c.description FROM master m LEFT JOIN categories c ON m.category_id = c.category_id; ................results bla bla....... 40000 rows in set (0.15 sec) mysql> create index test on master (master_id,category_id); Query OK, 40000 rows affected (0.29 sec) Records: 40000 Duplicates: 0 Warnings: 0 mysql> explain SELECT m.*, c.description FROM master m LEFT JOIN categories c ON m.category_id = c.category_id; +----+-------------+-------+--------+---------------+---------+---------+--------------------+-------+-------------+ | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | +----+-------------+-------+--------+---------------+---------+---------+--------------------+-------+-------------+ | 1 | SIMPLE | m | index | NULL | test | 9 | NULL | 40000 | Using index | | 1 | SIMPLE | c | eq_ref | PRIMARY | PRIMARY | 4 | news.m.category_id | 1 | | +----+-------------+-------+--------+---------------+---------+---------+--------------------+-------+-------------+ 2 rows in set (0.00 sec) mysql> SELECT m.*, c.description FROM master m LEFT JOIN categories c ON m.category_id = c.category_id; ................results bla bla....... 40000 rows in set (0.44 sec) mysql> drop index test on master; Query OK, 40000 rows affected (0.22 sec) Records: 40000 Duplicates: 0 Warnings: 0 mysql> SELECT m.*, c.description FROM master m LEFT JOIN categories c ON m.category_id = c.category_id; ................results bla bla....... 40000 rows in set (0.37 sec) Jasno mi je da do poboljsanja u brzini moze doci zahvaljujuci indeksiranom citanju cele tabele master. Ocigledno je da redosled igra ulogu, ali zasto je zapravo select sporiji kada je master_id na prvom mestu u indeksu (tj kada je category_id na prvom mestu)? [edit]Ono sto je jos zanimljivije - kako to da explain ne primeti anomaliju koja ocigledno dovodi do usporenja prilikom selecta?[/edit]
__________________
"It’s important to have goals when you pet. Otherwise you’re just rubbing another mammal for no reason." - Scott Adams Poslednja izmena od zextra : 18. 03. 2006. u 12:48. |
18. 03. 2006. | #13 | |
Super Moderator
Invented the damn thing
Datum učlanjenja: 06.06.2005
Poruke: 2.371
Hvala: 370
701 "Hvala" u 194 poruka
|
Citat:
|
|
02. 08. 2006. | #14 |
Domagoj Horvat
Expert
|
MySQL 4.0.26.
na InnoDB tablicama, rezultati su podjednaki, a JOIN je u prosjeku nesto brzi. jedan od rezultata: =============================== Summary: Join took 0.28575801849365 . Separate queries took 0.36347579956055 sa MyISAM tablicama, rezultati su podjednaki, iako su separate queries u prosjeku neznatno brzi. jedan od rezultata: =============================== Summary: Join took 0.65324687957764 . Separate queries took 0.58501100540161 Nesto mi ne valja trenutno sa MySQL serverom pa ne mogu kreirati foreign keys na master tabeli. je li probao netko to i sa kakvim rezultatima?
__________________
postoje ludosti bez kojih je nemoguce ljudsko dostojanstvo |
|
|
Slične teme | ||||
Tema | Početna poruka teme | Forum | Odgovori | Poslednja poruka |
Upis brojcanih vrednosti sa zarezom i tackom u MySQL | martinluter | SQL baze podataka - Sponzor: Baze-Podataka.net | 3 | 19. 05. 2009. 23:21 |
Brzi prsti | crews_adder | Opušteno | 3 | 24. 02. 2006. 18:33 |
quick lookup | ivanhoe | Web site, dizajn i multimedia | 3 | 16. 01. 2006. 23:55 |