 |
Forum PHP Romania - Discutii despre PHP, MySQL, Javascript, AJAX, etc Comunitatea PHP Romania
|
| 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 |
|
| |
|