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. |
|
|
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 |