 |
Forum PHP Romania - Discutii despre PHP, MySQL, Javascript, AJAX, etc Comunitatea PHP Romania
|
| Subiectul anterior :: Subiectul următor |
| Autor |
Mesaj |
xtremecris
Data înscrierii: 13/Feb/2004
Mesaje: 32
Locație: Bucuresti, Regie
|
| Trimis: Mie Oct 27, 2004 4:55 pm Titlul subiectului: Query greoi |
|
|
Aveti idee de ce un server de MySql scoate rezultat la query-ul urmator in 10 sec:
Cod:
select *
from telefoane
where
(tel1=3154531)or(tel2=3154531)
Iar urmatorul query in 0.32 sec:
Cod:
(select *
from telefoane
where
(tel1=3154531)
)
union all
(select *
from telefoane
where
(tel2=3154531)
Practic el returneaza acelasi rezultate. Sunt facuti indecsi pe ambele campuri. |
|
| Sus |
|
arond
Data înscrierii: 11/Mar/2004
Mesaje: 580
Locație: 127.0.0.1
|
| Trimis: Joi Oct 28, 2004 1:46 am Titlul subiectului: |
|
|
Foloseste EXPLAIN si o sa te lamuresti de ce indecsi sunt folositi, si in ce ordine.
Ceva de genul:
explain
select *
from telefoane
where
(tel1=3154531)or(tel2=3154531)
Banuiala mea este ca optimizatorul face un full table scan pentru primul query (si cred ca e normal... la modul general poate fi mai ieftin decat sa scaneze dupa fiecare index si apoi sa faca un union, asa cum e in query-ul 2). Dar e posibil sa spun tampenii :).
Numa' bune. |
|
| Sus |
|
xtremecris
Data înscrierii: 13/Feb/2004
Mesaje: 32
Locație: Bucuresti, Regie
|
| Trimis: Joi Oct 28, 2004 9:16 am Titlul subiectului: |
|
|
+---------+------+-------------------+--------+---------+--------+--------+-------------+
| table | type | possible_keys | key | key_len | ref | rows | Extra |
+---------+------+-------------------+--------+---------+--------+--------+-------------+
| telefoane | ALL | idx_tel1,idx_tel2 | [NULL] | [NULL] | [NULL] | 259422 | Using where |
+---------+------+-------------------+--------+---------+--------+--------+-------------+
Ciudat este ca daca scot OR si pun AND imi da raspunsul instantaneu adica in 0.18.
E vb de server de MySql ce ruleaza pe Linux exista vreo setare care schimba modul de cautare prin indecsi?
Eu am lucrat si cu un server de mySql sub Windows si mereu imi raspundea f. repede. Mi se pare ciudat ca cele 2 vers ale MySql se comporta diferit cand vine vorba de optimizare. |
|
| Sus |
|
arond
Data înscrierii: 11/Mar/2004
Mesaje: 580
Locație: 127.0.0.1
|
| Trimis: Joi Oct 28, 2004 12:47 pm Titlul subiectului: |
|
|
Optimizarea query-urilor e o chestiune destul de tricky.
Ce trebuie sa stii sunt:
1. Optimizatorul poate alege indecsii in functie de anumite date statistice adunate despre tabelele implicate - ANALYZE TABLE:
This statement analyzes and stores the key distribution for a table. During the analysis, the table is locked with a read lock. This works on MyISAM and BDB tables and (as of MySQL 4.0.13) InnoDB tables. For MyISAM tables, this statement is equivalent to using myisamchk -a.
MySQL uses the stored key distribution to decide the order in which tables should be joined when you perform a join on something other than a constant.
2. Se poate forta folosirea/nefolosirea anumitor indecsi intr-un query (desi eu m-as feri de asta). Vezi documentatia pentru SELECT si USE INDEX, FORCE INDEX, IGNORE INDEX.
Numa' bune. |
|
| Sus |
|
PHPRomania Bot
Bot Member
Data înscrierii: 27/Dec/2007
Mesaje: 1
Locaţie: Server Google |
| Trimis: Mie Dec 26, 2007 7:01 pm Titlul subiectului: Ad |
|
|
|
|
|
| Sus |
|
| |
|