SQL baze podataka - Sponzor: Baze-Podataka.net MySQL, MSSQL, Oracle, Access, ODBC. Ako imate problem brže i preciznije ćete dobiti odgovor ako priložite strukturu tabela ili skript koji kreira tabele i puni ih test podacima umesto što to problem opisujete samo rečima. Sponzor: Baze-Podataka.net - Blog o bazama podataka |
|
Alati teme | Način prikaza |
15. 06. 2007. | #1 |
Super Moderator
Invented the damn thing
Datum učlanjenja: 06.06.2005
Poruke: 2.371
Hvala: 370
701 "Hvala" u 194 poruka
|
MySQL - Optimizacija querija
Imam relativno veliku tabelu sa par stotina hiljada do par miliona domena. Struktura je sledeca:
Kôd:
CREATE TABLE `odm_result_keywords_de` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, `domain` varchar(255) NOT NULL DEFAULT '', `ovt_ext` int(11) DEFAULT NULL, `ovt_ext_local` int(11) DEFAULT NULL, `whois_status` varchar(100) DEFAULT NULL, `last_modified_date` date DEFAULT NULL, `domain_status` varchar(100) DEFAULT NULL, `nameserver` varchar(255) NOT NULL DEFAULT '', `master_id` int(10) unsigned NOT NULL DEFAULT '0', PRIMARY KEY (`id`), UNIQUE KEY `domain` (`domain`), KEY `ovt_ext` (`ovt_ext`), KEY `ovt_ext_local` (`ovt_ext_local`), KEY `whois_ovt` (`whois_status`,`ovt_ext`), KEY `domain_status` (`domain_status`) ) Kôd:
select domain from odm_result_keywords_de where whois_status is null and (ovt_ext > 0 or ovt_ext_local > 0) |
15. 06. 2007. | #2 |
Boris
Grand Master
Datum učlanjenja: 01.12.2005
Lokacija: Novi Sad
Poruke: 775
Hvala: 5
156 "Hvala" u 2 poruka
|
Edit: Da se ispravim:
Probaj da uklonis ovt_ext index, a da u whois_ovt dodas jos i ovt_ext_local polje. Sa explain proveri da li se whois_ovt index koristi. U prisustvu ovt_ext indexa, on se koristi umesto whois_ovt.
__________________
"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 : 15. 06. 2007. u 12:29. |
15. 06. 2007. | #3 |
Super Moderator
Invented the damn thing
Datum učlanjenja: 06.06.2005
Poruke: 2.371
Hvala: 370
701 "Hvala" u 194 poruka
|
OK odradio sam sledece:
- kreirao identicnu test tabelu i napunio je sa 15k domena - dropovao index ovt_ext - dropovao index whois_ovt - dodao index whois_ovt_local (whois_status, ovt_ext, ovt_ext_local) Kao output explaina sada sam dobio: Kôd:
mysql> explain select id,domain from odm_result_keywords_test where whois_status is null and (ovt_ext > 0 or ovt_ext_local > 0) limit 100; +----+-------------+--------------------------+------+-------------------------------+-----------------+---------+-------+-------+-------------+ | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | +----+-------------+--------------------------+------+-------------------------------+-----------------+---------+-------+-------+-------------+ | 1 | SIMPLE | odm_result_keywords_test | ref | ovt_ext_local,whois_ovt_local | whois_ovt_local | 103 | const | 16193 | Using where | +----+-------------+--------------------------+------+-------------------------------+-----------------+---------+-------+-------+-------------+ Poprilicno sam siguran da sam ovaj index probao i ranije, s tim da nisam dropovao ovt_ext index. Zasto je to neophodno? Inace, kada sam vratio index na ovt_ext nista se u explain izlazu nije promenilo, sto bi trebalo da znaci da ovt_ext ne mora da se dropuje? Inace, treba mi i index na ovt_ext jer se pored ovog chekiranja ista tabela koristi i iz frontenda (za pretrazivanje). Naravno ima mnogo i upisivanja, pa pokusavam da ne dodajem previse indexa da se ne uspori insert. Sad cu probati da dodam ovaj index (whois_status, ovt_ext, ovt_ext_local) na jednu pravu tabelu (trichavih 2 miliona slogova) pa cu javiti da li funkcionise. Poslednja izmena od dinke : 15. 06. 2007. u 13:36. |
15. 06. 2007. | #4 |
Igor Marinović
Expert
|
Meni je pomoglo sledece: postavio indekse kako treba, sa explain query vidim da ne koristi ono sto ja zelim ... Nakon jednog 'optimize table ...' sve je pocelo da leti, tako da optimize toplo preporucujem kod ovakvih slucajeva.
__________________
marinowski.com |
15. 06. 2007. | #5 |
Super Moderator
Invented the damn thing
Datum učlanjenja: 06.06.2005
Poruke: 2.371
Hvala: 370
701 "Hvala" u 194 poruka
|
Na ovako velikim tabelama dodavanje indexa traje preeeeeduuugooo... ne smem ni da pomislim koliko bi trajao optimize
edit Cisto da vidis o cemu pricam Kôd:
mysql> alter table odm_result_keywords_es add index whois_ovt_local(whois_status, ovt_ext, ovt_ext_local); Query OK, 2090574 rows affected (36 min 20.43 sec) Records: 2090574 Duplicates: 0 Warnings: 0 mysql> Kad smo vec na temi, sjajan MySQL Optimization Blog: http://www.mysqlperformanceblog.com/ Poslednja izmena od dinke : 15. 06. 2007. u 14:35. |
15. 06. 2007. | #6 |
Boris
Grand Master
Datum učlanjenja: 01.12.2005
Lokacija: Novi Sad
Poruke: 775
Hvala: 5
156 "Hvala" u 2 poruka
|
@dinke: Nisam siguran da je moja predpostavka tacna, ali mozda je mysql ovako gledao: imao si dva indexa, i ni jedan nije bio 100% odgovarajuci za pomenuti select query, ali je ovt_ext bio naveden pre whois_ovt, pa ga je zato mysql preferirao?
Primetih jos nesto: ako probas isti taj whois_ovt_local da definises tako sto ces staviti whois_local polje na kraj, index vise nece biti odgovarajuci. Zasto?
__________________
"It’s important to have goals when you pet. Otherwise you’re just rubbing another mammal for no reason." - Scott Adams |
15. 06. 2007. | #7 |
Super Moderator
Invented the damn thing
Datum učlanjenja: 06.06.2005
Poruke: 2.371
Hvala: 370
701 "Hvala" u 194 poruka
|
Odradio sam predlozenu proceduru, ali bez vidljivih rezultata:
Kôd:
mysql> select id,domain from odm_result_keywords_es where whois_status is null and (ovt_ext > 0 or ovt_ext_local > 0) limit 100; Empty set (29.15 sec) mysql> explain select id,domain from odm_result_keywords_es where whois_status is null and (ovt_ext > 0 or ovt_ext_local > 0) limit 100; +----+-------------+------------------------+------+---------------------------------------+-----------------+---------+-------+---------+-------------+ | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | +----+-------------+------------------------+------+---------------------------------------+-----------------+---------+-------+---------+-------------+ | 1 | SIMPLE | odm_result_keywords_es | ref | ovt_ext,ovt_ext_local,whois_ovt_local | whois_ovt_local | 103 | const | 2088308 | Using where | +----+-------------+------------------------+------+---------------------------------------+-----------------+---------+-------+---------+-------------+ 1 row in set (0.00 sec) Evo indexa koji sada postoje u tabeli: Kôd:
mysql> show index from odm_result_keywords_es; +------------------------+------------+-----------------+--------------+---------------+-----------+-------------+----------+--------+------+------------+---------+ | Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | +------------------------+------------+-----------------+--------------+---------------+-----------+-------------+----------+--------+------+------------+---------+ | odm_result_keywords_es | 0 | PRIMARY | 1 | id | A | 2090574 | NULL | NULL | | BTREE | | | odm_result_keywords_es | 0 | domain | 1 | domain | A | 2090574 | NULL | NULL | | BTREE | | | odm_result_keywords_es | 1 | ovt_ext | 1 | ovt_ext | A | 138 | NULL | NULL | YES | BTREE | | | odm_result_keywords_es | 1 | ovt_ext_local | 1 | ovt_ext_local | A | 77 | NULL | NULL | YES | BTREE | | | odm_result_keywords_es | 1 | whois_ovt_local | 1 | whois_status | A | 2090574 | NULL | NULL | YES | BTREE | | | odm_result_keywords_es | 1 | whois_ovt_local | 2 | ovt_ext | A | 2090574 | NULL | NULL | YES | BTREE | | | odm_result_keywords_es | 1 | whois_ovt_local | 3 | ovt_ext_local | A | 2090574 | NULL | NULL | YES | BTREE | | +------------------------+------------+-----------------+--------------+---------------+-----------+-------------+----------+--------+------+------------+---------+ 7 rows in set (0.00 sec) Poslednja izmena od dinke : 15. 06. 2007. u 16:26. |
15. 06. 2007. | #8 | |
Ivan Dilber
Sir Write-a-Lot
|
dve ideje koje mozda pomognu (iz mysql manuala):
Citat:
__________________
Leadership is the art of getting people to want to do what you know must be done. |
|
15. 06. 2007. | #9 |
Knowledge base
Wrote a book
Datum učlanjenja: 16.06.2005
Lokacija: Novi Sad
Poruke: 1.437
Hvala: 37
131 "Hvala" u 82 poruka
|
Iz mog iskustva, na tako velikim tabelama, indexi ne pomazu previse.
Zato ih obicno splitujem po nekom kriterijumu, koji omogucava da ukupno vreme pretrage za sve te tabele uvek bude manje od vremena pretrage za jednu u kojoj su svi recordi. Naravno, to zahteva vise posla oko inserta i update-a istih (i vise select query-ja), ali mislim da vredi.
__________________
Năo quero mais seguir um só caminho |
15. 06. 2007. | #10 |
Boris
Grand Master
Datum učlanjenja: 01.12.2005
Lokacija: Novi Sad
Poruke: 775
Hvala: 5
156 "Hvala" u 2 poruka
|
Pokusaj da izvrsis isti query, s tim sto ces proveravati "whois_status is not null", pa vidi da li se nesto menja (kako si rekao, za 99% zapisa vrednost je null), bar da znas da li index radi kako treba. Ili eksperimentisi sa preostala dva parametra.. Sto je veci dataset iz kog biras podatke, vece je usporenje, ma koliko da ti je dobar index.
__________________
"It’s important to have goals when you pet. Otherwise you’re just rubbing another mammal for no reason." - Scott Adams |
|
|
Slične teme | ||||
Tema | Početna poruka teme | Forum | Odgovori | Poslednja poruka |
[MySQL] Optimizacija upita, indexi | mb_sa | SQL baze podataka - Sponzor: Baze-Podataka.net | 15 | 30. 08. 2009. 16:47 |
MySQL optimizacija | bluesman | SQL baze podataka - Sponzor: Baze-Podataka.net | 2 | 27. 02. 2009. 15:47 |
CSS optimizacija | Vladimir Nikolic | (X)HTML, JavaScript, DHTML, XML, CSS | 25 | 23. 08. 2006. 21:54 |
PHP optimizacija | bluesman | PHP | 10 | 16. 05. 2006. 01:04 |
optimizacija koda? | Blood | SQL baze podataka - Sponzor: Baze-Podataka.net | 12 | 26. 03. 2006. 17:53 |