WN

WN (https://www.wn.se/forum/index.php)
-   Serversidans teknologier (https://www.wn.se/forum/forumdisplay.php?f=4)
-   -   MySQL index för ett högt antal kolumner (https://www.wn.se/forum/showthread.php?t=38586)

objx 2009-08-19 16:00

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!

WizKid 2009-08-19 16:50

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.

objx 2009-08-19 18:14

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.

hnn 2009-08-19 21:10

Testa att sätta EXPLAIN framför SELECT, så ser du ifall indexet används i frågan...

danjel 2009-08-20 13:09

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

objx 2009-08-20 14:02

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?

danjel 2009-08-20 16:04

Yes det stämmer bra..


Alla tider är GMT +2. Klockan är nu 00:43.

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