PHP query tar tid

Swedie

Administrator
Personal
Gick med
6 Mar 2003
Ort
Stockholm-ish
Hoj
Yamaha R1
Följande tar extremt lång tid... förståerligt kanske. Men går den att speeda upp?

PHP:
SELECT thread.threadid, thread.title, forum.title AS forumtitle, thread.lastposter, thread.lastpost FROM thread,forum WHERE forum.forumid = thread.forumid AND thread.forumid NOT IN(3,6,11,12,19,20,24,28,29,31,32,34,35,36,37,38,40,41,43,44,45,48,49,50,52,53) AND thread.threadid NOT IN(666,265,25545,1956,29221,26457,29799,5925,30150,30176,29841,30227,426,30251,30192,30258,30271,30297,30303,30371,30574,30820,30844,30267,31155,7999,31362,1387,31465,31631,32145,32279,33108,33066,33123,33172,33055,32906,33328,25217,33333,33348,33358,28307,33547,33545,33554,34277,34252,34580,34728,34715,34783,33779,35234,35252,35315,35321,35251,35408,35316,35633,35677,35708,35751,35704,35858,35859,35939,35964,36313,36364,36786,36591,26591,36943,36977,37097,37306,37584,37852,37901,38002,38062,38162,38303,38307,38348,38688,38618,38793,39575,40286,38508,39352,40374,40329,40511,40435,40602,40612,40568,40716,40718,40720,41043,40650,41109,41139,41026,41157,41176,41294,19026,41302,41465,41470,41438,41357,41708,41698,42057,42511,42701,43383,43522,43506,43589,43643,43739,43800,43834,43879,44000,44340,44409,44496,44586,44630,44627,44312,45918,46060,46291,46721,46747,47244,47455,47561,47933,48059,48507,49440,46729,49686,49838,49846,49853,42127,49955,50011,50120,50574,50676,50709,50725,50728,50729,50231,50540,51134,51300,51385,51410,51412,51507,50265,51619,51815,51868,51911,51917,51930,51987,52104,52105,52121,52537,52739,53070,53441,53457,53687,53739,54098,54134,54115,54231,53676,54394,54452,54610,54597,55068,55811,55939,55954,56016,56180,56201,56193,56161,55813,56388,56486,56628,56770,56833,56503,56777,57323,57378,57363,57524,55405,55405,57349,52136,57674,57763,57784,57786,57830,57802,57850,57859,57625,58053,57959,57949,57415,58254,57717,58448,58545,58576,58568,58509,58677,59424,59333,59555,59501,59379,59589,59814,59924,60007,59914,60206,60302,60225,42374,30575,59287,60195,60274,60451,60720,14220,60810,60719,60890,60998,61119,61125,61134,61284,61289,61321,61241,61303,61369,60625,61478,61512,25288,61154,61649,55992,61704,61710,61713,58737,61898,61901,61912,61938,61940,61980,61995,62027,61808,62112,62036,62099,62198,62172,62303,62402,62252,62448,62511,62622,62592,62621,62623,62630,62627,62685,62684,62664,62725,62729,62757,62814,62811,62851,61785,62881,62980,62879,62745,63016,63025,63135,63135,63158,63223,63227,63244,63289,63332,63394,63429,63515,63465,63456,63568,63587,63682,63731,63709,63803,63803,62309,63860,63830,63921,64003,64188,64218,64273,64274,63852,63845,64389,64353,64425,64529,64594,64567,63644,64746,60825,64818,65128,65851,65858,65869,65831,65926,65770,63729,66008,66023,66102,66104,66106,66166,66245,66259,66320,66552,66442,66739,61700,66875,66856,66856,67039,66919,67134,67135,67028,67346,67400,67353,67579,67694,67704,67995,68340,68972,66987,69464,69462,69769,69773,69858,70513,70519,71125,71155,71163,71219,70832,65872,71467,71580,72038,71978,4505,72273,68645,72207,72347,72310,72312,72390,72443,71829,72424,72618,72677,72747,72678,66860,73230,73329,74083,74397,74522,74736,74899) ORDER BY lastpost DESC LIMIT 8;
 
Helv... Det var den värsta "NOT IN"-sats jag sett någonsin! Inte konstigt det tar tid.

Lägg alla värden i en indexerad temp-tabell som du sedan kör "NOT IN" mot.
 
Zormin skrev:
Helv... Det var den värsta "NOT IN"-sats jag sett någonsin! Inte konstigt det tar tid.

Lägg alla värden i en indexerad temp-tabell som du sedan kör "NOT IN" mot.
Hur exakt då för att göra det rätt... =)
 
Swedie skrev:
Hur exakt då för att göra det rätt... =)
Beror väl på vilken DB. Så här hade jag gjort i SQL Server 2000.

CREATE TABLE #MyTempTable (TheValue INT PRIMARY KEY)
-- Fyll temptabellen med alla värden här på lämpligt sätt
SELECT...WHERE...AND thread.threadid NOT IN (SELECT TheValue from #MyTempTable) ORDER BY...
DROP TABLE #MyTempTable

SQL Server 2000 skapar alltid ett unikt index för primärnycklar, därför behöver jag inte göra ALTER TABLE... i efterhand för att skapa det.
 
Pröva om det inte går lite fortare med INNER JOIN:

SELECT thread.threadid, thread.title, forum.title AS forumtitle, thread.lastposter, thread.lastpost FROM thread INNER JOIN forum ON forum.forumid = thread.forumid WHERE thread.forumid NOT IN
(3,6,11,12,19,20,24,28,29,31,32,34,35,36,37,38,40,41,43,44,45,48,49,50,52,53)
AND thread.threadid NOT IN
(666,265,25545,... osv..
 
vad gör inner join bättre o varför yada yada. vet en del om php men inte just hur mysql queries kan optimeras o bli snabbare.

Det är detta script som sölar ner sidan mest nu när det är nästan 700 online.
 
Tog bort scriptet o helt plötsligt funkar sajten galant med 700 användare online.

Argh..
 
JOIN-kommandot är till för att optimera sådana här databas-frågor när du ska hämta data från flera olika databaser, eller utesluta. Ta en titt på http://dev.mysql.com/doc/mysql/en/join.html så kan du nog hitta lite lösningar på att snabba upp din kod.

Svårt att hjälpa till när man inte labbar med det själv :gnissla
 
Skapa en vy och kör sedan din select sats på vyn.

Detta ska snabba upp frågan eftersom selectsatsen i vyn har en exekveringsplan(förberedd att köras).

Om du inte vet hur man skriver så hjälper jag till!
 
Det skulle bli:

CREATE VIEW MinVy (forumtitle, lastposter, lastpost)
AS
SELECT thread.threadid, thread.title, forum.title
FROM thread,forum
WHERE forum.forumid = thread.forumid AND thread.forumid NOT IN(....) AND thread.threadid NOT IN(....)

Sedan gör du ditt urval på vyn:

SELECT * FROM MinVy
ORDER BY lastpost DESC LIMIT 8;
 
AluminiumHead skrev:
Det skulle bli:

CREATE VIEW MinVy (forumtitle, lastposter, lastpost)
AS
SELECT thread.threadid, thread.title, forum.title
FROM thread,forum
WHERE forum.forumid = thread.forumid AND thread.forumid NOT IN(....) AND thread.threadid NOT IN(....)

Sedan gör du ditt urval på vyn:

SELECT * FROM MinVy
ORDER BY lastpost DESC LIMIT 8;
Funkar inte så bra. Får mysql query fel.. efter 'VIEW.

Hur kör man detta kommando?

Jag la upp följande test som inte funkar:
mysql_query("CREATE VIEW forumview (threadid, title, lastpost, forumid, lastposter) AS SELECT * FROM thread") or die("Invalid Create View: " . mysql_error());
$sql = mysql_query("SELECT * FROM forumview ORDER BY lastpost DESC LIMIT 8");
 
Nu har jag lagt ett script inuti "while" för att exkludera visa ID's. får se om det funkar när det blir mycket folk på sidan.
 
Swedie skrev:
Nu har jag lagt ett script inuti "while" för att exkludera visa ID's. får se om det funkar när det blir mycket folk på sidan.
Ok, så det är en fast lista över trådar som inte ska visas eller? Då kanske det är läge att ha skapa egen tabell för dessa? Är det bara en lista över id:n kan du ha ett unikt index på tabellen och då kommer ditt "NOT IN"-villkor fungera mycket bättre. Tillkommer det fler trådar som inte ska visas lägger du bara till rader i den tabellen.
 
Zormin skrev:
Ok, så det är en fast lista över trådar som inte ska visas eller? Då kanske det är läge att ha skapa egen tabell för dessa? Är det bara en lista över id:n kan du ha ett unikt index på tabellen och då kommer ditt "NOT IN"-villkor fungera mycket bättre. Tillkommer det fler trådar som inte ska visas lägger du bara till rader i den tabellen.
har redan en tabell med threadid's. Forumid's är för få för att läggas i tabell.

Har bytt nu till att inte använda NOT IN då det tar för lång tid, tydligen. Men ska se ikväll när det kommer inte fler folk om det funkar bättre.
 
Swedie skrev:
Funkar inte så bra. Får mysql query fel.. efter 'VIEW.

Hur kör man detta kommando?

Jag la upp följande test som inte funkar:
mysql_query("CREATE VIEW forumview (threadid, title, lastpost, forumid, lastposter) AS SELECT * FROM thread") or die("Invalid Create View: " . mysql_error());
$sql = mysql_query("SELECT * FROM forumview ORDER BY lastpost DESC LIMIT 8");

Vyn ska skapas i databashanteraren så att den ligger i databasen som en "tabell" och inte varje gång man kör skriptet.

"En vy är inte en fysisk tabell som lagras i databasen, utan en virtuell tabell vars innehåll bildas ur bastabellerna när vyn används. Då databashanteraren träffar på en vy i en SQL-fråga, exekveras den underliggande frågan bakom vyn. Den erhållna resultatmängden lagras internt i en temporär tabell. I SQL-frågan kan sedan den erhållna resultatmängden hanteras precis som en tabell med samma namn som vyn."
 
Swedie skrev:
har redan en tabell med threadid's. Forumid's är för få för att läggas i tabell.

Har bytt nu till att inte använda NOT IN då det tar för lång tid, tydligen. Men ska se ikväll när det kommer inte fler folk om det funkar bättre.
Men då kan du inte ha ett unikt index på tabellen med förbjudna id:n. Har du ett unikt index går villkoret mycket fort eftersom databasen inte behöver söka i tabellen utan den vet direkt via indexet om id:t finns eller ej.
 
Nyheter
En dag på dragstrippen

Efter att ha varit aktiv so...

Steve McQueens Scott Squirrel till salu

Detta Scott Flying Squirrel...

Dags för Strängnäs Bike Show!

Sista lördagen i augusti är...

Bikeweekend på Kjula denna helg

Den 22-23 augusti är det da...

Motorcycle Inferno #8

Den 5 september blir Laxhol...

Tiotusentals körde Mälaren Runt

Lördagen den 15 augusti gen...

Mälaren Runt fyller 40 år

Nu på lördagen den 15 augus...

Steve Holcombe klar för GGN!

Pressmeddelande 2026-08-10 ...

Nya Chief Vintage Sturgis

I samband med 86:e Sturgis ...

Missa inte Bikes sommarnummer!

Innehåll Bike powered by...

Back
Top