FAQ |
Kalender |
2009-08-19, 17:00 | #1 | ||
|
|||
Medlem
|
Jag sitter just nu och jobbar med en MySQL-tabell innehållandes fastighetsdata.
I tabellen så finns det bland annat följande uppgifter: Geografisk data: Land, Område, adress, postnummer, postort Ytor: boarea, biarea, tomtarea Rum: antal rum, sovrum, badrum Pris: valuta, pris Beskrivande: titel, kortare beskrivning, full beskrivning Jag behöver skapa en sökmotor där ett flertal av dessa kolumner (10+) är sökbara. Mina funderingar är följande: Låt säga att jag skapar ett index för större delen av ovanstående kolumner: boarea,biarea,tomtarea,rum,sovrum,badrum,pris,tite l,beskrivning Om jag då sedan kör en query där villkorssatsen endast innehåller 2 av dessa kolumner: SELECT .... WHERE boarea > '50' && pris <= '1500000' Kommer MySQL då att kunna utnyttja mitt stora index till denna fråga? Om så är fallet, är det den mest optimala lösningen? Skulle en sådan fråga ta märkvärt kortare tid med ett index som bara innehöll boarea och pris? Att indexet skulle bli rätt stort har ingen betydelse. Jag har jobbat rätt mycket med index i MySQL, men den här typen av frågor har jag aldrig behövt handskas med. Är det någon som har några vettiga synpunkter på detta så tar jag tacksamt emot dessa! |
||
Svara med citat |
2009-08-19, 17:50 | #2 | ||
|
|||
Mycket flitig postare
|
MySQL kommer bara kunna använda kolumner från vänster i indexet. Så den kommer kunna använda det för boarea. Men om du har queryn WHRE biarea > 10 så kommer den inte alls kunna använda indexet.
|
||
Svara med citat |
2009-08-19, 19:14 | #3 | ||
|
|||
Medlem
|
Vad brukar vara det vanligaste sättet att lösa den här typen av problem då?
En idé jag hade var att sätta ett index på de tre kolumner som förekommer flest i villkorssatser, och alltid placera dessa villkor först i queryn. T.ex: Om jag skapar ett index för kolumnerna boarea och pris, och jag har en query som ser ut på följande sätt: SELECT ... FROM ... WHERE boarea > 50 && pris > 1500000 && rum > 3 ... övriga villkor. Kommer MySQL då att dra nytta av detta index för att begränsa resultatet innan de övriga villkoren vägs in? (t.ex. rum > 3 etc.) Även om det är på det viset så kan jag inte komma fram till ett bra sätt att lösa detta på. Säg att det är 8 kolumner ur tabellen som används i 80% av sökningarna. Måste man bygga upp ett index för varje tänkbar villkorskombination då för att MySQL skall kunna använda ett index vid varje query? D.v.s: index1: land, stad, boarea, pris index2: land, stad, pris index3: land, boarea, pris Det låter ju onekligen rätt rörigt. |
||
Svara med citat |
2009-08-19, 22:10 | #4 | ||
|
|||
Banned
|
Testa att sätta EXPLAIN framför SELECT, så ser du ifall indexet används i frågan...
|
||
Svara med citat |
2009-08-20, 14:09 | #5 | ||
|
|||
Medlem
|
Citat:
Ja , om inte queryn i övrigt är galen kommer den det.. Citat:
SELECT land=x AND stad=x AND pris=x viket nog ger bra prestanda då endast en scan på "pris" ur resultatet |
||
Svara med citat |
2009-08-20, 15:02 | #6 | ||
|
|||
Medlem
|
Om jag har förstått det rätt så skulle det alltså bli på följande sätt:
Med ett index på kolumnerna "land","stad","pris": Om jag ställer frågan... SELECT ... FROM.. WHERE land='XXXX' AND stad='XXXX' AND pris < '1500000' ... så skulle detta index användas, och samtliga kolumner kommer att läsas ur index. Men om jag ställer frågan... SELECT ... FROM .. WHERE land='XXXX' AND pris < '1500000' ... så kommer mitt index även att användas här, men det är endast "land"-villkoret som utnyttjar detta index. "pris"-indexet kan inte användas eftersom inget villkor för "stad" är satt. Stämmer det? |
||
Svara med citat |
2009-08-20, 17:04 | #7 | ||
|
|||
Medlem
|
Yes det stämmer bra..
|
||
Svara med citat |
Svara |
|
|