webForumDet fria alternativet

Paging på avancerad sökning

1 svar · 268 visningar · startad av SoMeOnE

SoMeOnEMedlem sedan nov. 200254 inlägg
#1

Jag håller på att göra ett adminsystem till ett större projekt. Det jag undrar är ifall det finns någon bra sätt att konstruera sökningar på t ex ordrar i en databas där det kommer att köras rätt tunga sql-sattser. För tillfället körs det ca 5 sql-satser på på hela order-tabellen (några med inner joins och/eller subquries).
Det är uppdelat i en sats som är själva sökningen för vilka rader som ska visas. En sats som räknar de raderna för att göra en paging. Sen finns det några kategorier som man kan välja mellan, så som "nya ordrar", "betalade ordrar", "skickade ordrar" osv där det också körs en count för att se hur många det finns i varje kategori.

Det som känns fel och borde kunna ta rätt mycket extra datorkraft är när man gör en sökning och den ska hitta hitta alla relevanta ordrar 5 gånger för att det ska kunna räkna vilka som hör till vilken kategori och hur många som finns i den rikigta sökningen osv.

Så det jag undrar över är skulle det finnas någon användning att skapa en temp table och sen söka igenom den? Känns som det också skulle kunna bli tungt ifall den skulle behöva kopiera över hela tabellen ifall man söker på ett tomt värde (sökningsfältet är egentligen en listning där man kan söka så tomt är standard).

Sen finns det något bra sätt att ta reda på hur många rader en sökning skulle ha returnerat ifall man inte hade haft med LIMIT i satsen. T ex:
"SELECT Name, CustomerID FROM `order` WHERE NAME LIKE '%pelle%' LIMIT 10" Utan att göra en 2:a sql-sats: "SELECT COUNT(*) FROM `order` WHERE NAME LIKE '%pelle%'"?

Jag är öppen för alla idéer och förslag.

rustMedlem sedan dec. 200310 inlägg
#2

Upplever du det som langsamt? Prova att lägg in ordentligt med data i tabellerna och testa dina queries, inte sakert att det behöver optimeras (databaser är ganska bra pa att läsa informationa). Det kanske räcker med nagot extra index? Om du har väldigt knepiga queries kan du kanske skapa en view far den querien? en sadan query _borde_ din db kunna optimera pa ett bra sätt (istället för en temp-tabell).

en annan idé är att läsa ut den datan du behöver en gang, sedan använda php's funktioner istället för count(). t ex (i pseudo-php).

order_array = select * from orders;

foreach order_array as order
print order;

print sizeof(order_array) . 'beställningar i databasen.'

utan att se dina queries kan jag inte ge mer förslag.

131 ms totalt · 3 externa anrop · v20260731065814-full.fb544a5a
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
127 ms — hämta tråd, inlägg och bilagor (db)