Pagina de start a forumului Forum PHP Romania - Discutii despre PHP, MySQL, Javascript, AJAX, etc Forum PHP Romania - Discutii despre PHP, MySQL, Javascript, AJAX, etc
Comunitatea PHP Romania
 

viteza join
Vezi mesajul original

 
       Pagina de start a forumului Forum PHP Romania - Discutii despre PHP, MySQL, Javascript, AJAX, etc -> MySQL
Subiectul anterior :: Subiectul următor  
Autor Mesaj
dev8



Data înscrierii: 01/Iun/2004
Mesaje: 50

Trimis: Joi Sep 15, 2005 11:39 am    Titlul subiectului: viteza join  

salut,

am 2 tabele, una master alta detail. In cea master am masini, in cea detail culorile disponibile pt fiecare masina, asrfel:

master(tb_cars): id(PK, autoincr) nume ...etc
indecsi individuali: id, nume(fulltext)


detail(tb_cul): id(PK, autoincr) id_master(FK) culoare data_ora
indecsi individuali: id, id_master, data_ora




deci ele se leaga prin id_master.

Eu vreau sa selectez toate id-urile culorilor pentru masinile cautate de client, in ordine descresc a relevantei si a datei disponibilitatii culorii ( nu ma intrebati de ce :) )

am realizat acest SELECT:

Cod:
SELECT a.id, a.data_ora, MATCH (b.nume)
AGAINST (
'Mercedes'
) AS score
FROM tb_cul a,tb_cars b
WHERE MATCH (b.nume)
AGAINST (
'+Mercedes'
IN boolean
MODE
) AND a.id_master=b.id
ORDER BY score DESC, a.data_ora DESC


La tabele imense, Using temp si Using filesort (acestea apar la selectul de mai sus in campul extra din explain) se simt urat ( tabelele sunt de sute de mii de rows ). Dureaza cam 14 sec. Pot face selectul mai rapid, eventual sa nu mai Using temp ? Banuiesc ca de Using filesort nu pot scapa. Sau pot ?

Multumesc
Sus  
johnny



Data înscrierii: 31/Iul/2004
Mesaje: 904
Locație: Bucuresti

Trimis: Joi Sep 15, 2005 12:51 pm    Titlul subiectului:  

Solutia pe care o vad eu este o normalizare a bazei de date.

Avand in vedere ca folosesti MATCH against pentru a "detecta" marca masinii, trag concluzia, ca designul bazei de date e problematic.
Ce reprezinta acea relevanta? pozitia marcii in cadrul denumirii masinii?
E pentru un site al unei reprezentante auto?

Deci, uite cum vad eu structura bazei:

tabel manufacturers (aici retii marcile posibile: mercedes, etc...):

manufacturers_id (pk, auto_increment)
manufacturers_name

tabel masini:

id_masina (pk, auto_increment)
denumire_masina
..alte info


tabel culori:

color_id (pk, auto_increment)
color_name

si tabel culori_masini:

culoare_masina_id(pk, auto_increment)
id_masina
color_id
data_ora //nu am idee la ce foloseste asta sau la ce se refera...

pui indecsi pe foreign keys si campurile dupa care sortezi/folosesti in filtrare... si o sa mearga mult mai rapid ...

Modelul de mai sus e doar o idee, bazata pe informatiile succinte din postul anterior. daca detaliezi problema, se poate obtine solutie optima.

Un design bun al bazei de date te scapa de o groaza de probleme in partea de scris cod.
Sus  
dev8



Data înscrierii: 01/Iun/2004
Mesaje: 50

Trimis: Joi Sep 15, 2005 2:45 pm    Titlul subiectului:  

campul nume din tb_cars nu trebuie luat ca atare. el este varchar(255) si uneori chiar atinge aceasta marime, in el aflandu-se un sir de cuvinte care insa cuprinde si ceea ce cauta clientul. mai mult nu pot detalia, sorry, dar specific clar ca acest camp este varchar(255) si numai cu un fulltext pot face cautarea (nu exista o matrita anume, nu exista nimic. sir de cuvinte). deci nu lua ca atare exemplul de mai sus, nici tabela culori nu este ceea ce am descris, dar modelul este exact.


deci neaparat match() against ().

intrebarea este cum scap mai ieftin cu sortarea aceea :( sau sa nu faca o tabela temp

thanks
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  
 
       Pagina de start a forumului Forum PHP Romania - Discutii despre PHP, MySQL, Javascript, AJAX, etc -> MySQL
Pagina 1 din 1


Powered by phpBB 2.0.22 © 2001, 2002 phpBB Group
Varianta în limba română: Romanian phpBB online community