Kom ihåg mig?
Home Menu

Menu


MySQL index för ett högt antal kolumner

Ämnesverktyg Visningsalternativ
Oläst 2009-08-19, 17:00 #1
objx objx är inte uppkopplad
Medlem
 
Reg.datum: Mar 2008
Inlägg: 154
objx objx är inte uppkopplad
Medlem
 
Reg.datum: Mar 2008
Inlägg: 154
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!
objx är inte uppkopplad   Svara med citatSvara med citat
Oläst 2009-08-19, 17:50 #2
WizKid WizKid är inte uppkopplad
Mycket flitig postare
 
Reg.datum: Apr 2004
Inlägg: 618
WizKid WizKid är inte uppkopplad
Mycket flitig postare
 
Reg.datum: Apr 2004
Inlägg: 618
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.
WizKid är inte uppkopplad   Svara med citatSvara med citat
Oläst 2009-08-19, 19:14 #3
objx objx är inte uppkopplad
Medlem
 
Reg.datum: Mar 2008
Inlägg: 154
objx objx är inte uppkopplad
Medlem
 
Reg.datum: Mar 2008
Inlägg: 154
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.
objx är inte uppkopplad   Svara med citatSvara med citat
Oläst 2009-08-19, 22:10 #4
hnn hnn är inte uppkopplad
Banned
 
Reg.datum: Mar 2004
Inlägg: 2 587
hnn hnn är inte uppkopplad
Banned
 
Reg.datum: Mar 2004
Inlägg: 2 587
Testa att sätta EXPLAIN framför SELECT, så ser du ifall indexet används i frågan...
hnn är inte uppkopplad   Svara med citatSvara med citat
Oläst 2009-08-20, 14:09 #5
danjel danjel är inte uppkopplad
Medlem
 
Reg.datum: Nov 2003
Inlägg: 214
danjel danjel är inte uppkopplad
Medlem
 
Reg.datum: Nov 2003
Inlägg: 214
Citat:
Ursprungligen postat av objx
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

Ja , om inte queryn i övrigt är galen kommer den det..

Citat:
Ursprungligen postat av objx

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.
Nej det är inte nödvändigt , tex index2 kan vara onödigt då index1 delvis kommer användas tex vid
SELECT land=x AND stad=x AND pris=x
viket nog ger bra prestanda då endast en scan på "pris" ur resultatet
danjel är inte uppkopplad   Svara med citatSvara med citat
Oläst 2009-08-20, 15:02 #6
objx objx är inte uppkopplad
Medlem
 
Reg.datum: Mar 2008
Inlägg: 154
objx objx är inte uppkopplad
Medlem
 
Reg.datum: Mar 2008
Inlägg: 154
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?
objx är inte uppkopplad   Svara med citatSvara med citat
Oläst 2009-08-20, 17:04 #7
danjel danjel är inte uppkopplad
Medlem
 
Reg.datum: Nov 2003
Inlägg: 214
danjel danjel är inte uppkopplad
Medlem
 
Reg.datum: Nov 2003
Inlägg: 214
Yes det stämmer bra..
danjel är inte uppkopplad   Svara med citatSvara med citat
Svara


Aktiva användare som för närvarande tittar på det här ämnet: 1 (0 medlemmar och 1 gäster)
 

Regler för att posta
Du får inte posta nya ämnen
Du får inte posta svar
Du får inte posta bifogade filer
Du får inte redigera dina inlägg

BB-kod är
Smilies är
[IMG]-kod är
HTML-kod är av

Forumhopp


Alla tider är GMT +2. Klockan är nu 16:27.

Programvara från: vBulletin® Version 3.8.2
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Svensk översättning av: Anders Pettersson
 
Copyright © 2017