Følgende SQL SELECT * FROM s_dk WHERE Domain LIKE '%a%' ORDER BY (IF(Domain LIKE '%a%', 1, 0)) DESC LIMIT 18880, 20 kan tage mellem 0,7 - 1,3 sekunder..!!!
Jeg har prøvet at installere MySQL 4.17 på en anden PC med en 2,4 GHz AMD og Windows 2000 prof. hvilket KUN resulterer i at søgningen bliver ca. dobbelt så hurtig. Herefter prøvede jeg at koble op til en MySQL version 4.016 over internettet (512kbps) hvilket reducerede søgetiden til ca. en tiendedel..!!!
Er MySQL 4.17 noget skrammel..?? Jeg havde samme ballade med ver. 5.0 derfor prøvede jeg at skifte til 4.17... Eller har jeg installeret en uheldig windows update ..?? Eller nogen andre forslag..??
Du mangle (næsten) uden tvivl at lave et index på "domain" - det er den normale årsag hvis jeg har hastighedsproblemer - uden index skal MySQL jo søge alle records igennem en-for-en.
citat : ....Herefter prøvede jeg at koble op til en MySQL version 4.016 over internettet (512kbps) hvilket reducerede søgetiden til ca. en tiendedel..!!! Samme database..!!!
Det er ikke helt fair at sammenligne hastighed med en konstruktion som WHERE Domain LIKE '%a%' der skal løbe alt igennem, og ikke kan udnytte et evt index. Men forklaringen er måske at mysql til windows ikke kommer på højde med mysql til unix-lignende platforme. Din mysql på nettet kørte vel ikke windows?
..Den jeg prøvede over nettet er en AMD Duron 1,3 GHz, 768MB(PC133), Windows 2000 prof. (ikke Server)...Forskellen er kun MySQL versionen....4.17 her hos mig og 4.016 hos min makker i den anden ende af en 512Kbps ADSL....
Hvorfor i alverden har du den ORDER BY på? Du har jo via din WHERE allerede sørget for at den altid returnerer 1...
Du tvinger MySQL til at gennemløbe samtlige 36189 records flere gange, så der er ikke noget at sige til det er langsomt.
Prøv først og fremmest at fjerne din ORDER BY.
Du kan ikke sammenligne installationer/versioner udelukkende på baggrund af RAM og processorhastighed. Der er sikkert indstillinger i opsætningen på de to maskiner som er vildt forskellige. Prøv at køre SHOW VARIABLES på begge maskiner og sammenlign.
...jo det lyder grangiveligt som alle records bliver gennemløbet i ver 4.17 men det ser ikke ud til at ske i ver 4.016....Hvilke parametre skal jeg være særlig opmærksom på..?? De hedder ikke det samme.
sjh> forstår ikke helt dit spørgsmål. Mener jeg, der er forskel mellem hvordan 4.0 og 4.1 håndterer den ORDER BY? Nej, det gør jeg ikke -- men det ændrer ikke på, at den koster dyrt og er fuldstændigt unødvendig.
spuncut> ja, og så? Hvor er sammenligningen med den server du siger der er hurtig? Hvor er forskellene?
Den langsomme har kun en halvt så stor buffer til at cache læsninger fra disk - så den skal stå og vente på disken ca. dobbelt så mange gange som den hurtige.
Den hurtige har 10x så meget plads some den langsomme til at foretage sorteringer (herunder ORDER BY). Den langsomme skal med stor sandsynlighed skrive og læse til/fra disken under sortering, mens den hurtige kan have det hele i RAM.
Men tag nu lige og test uden den der ORDER BY først, inden du går i gang med at pille ved server indstillingerne.
Af ren nysgerrighed: kan flg. måske være en mere effektiv query?
SELECT *, IF(Domain LIKE '%a%', 1, 0) + IF(Domain LIKE '%b%', 1, 0) + IF(Domain LIKE '%c%', 1, 0) AS score FROM s_dk HAVING score > 0 ORDER BY score DESC LIMIT 18880, 20
Min umiddelbare antagelse er, at hvis der vælges mange records til visning vil dette være mere effektivt -- men hvis der kun udvælges en lille procentdel, så vil det i værste fald være en smule langsommere end den oprindelige query.
Lagde i øvrigt mærke til at query cache er 0 på begge servere. Foreslår at du læser lidt op på dette emne.
SELECT *, IF(Domain LIKE '%a%', 1, 0) + IF(Domain LIKE '%b%', 1, 0) + IF(Domain LIKE '%c%', 1, 0) AS score FROM s_dk HAVING score > 0 ORDER BY score DESC LIMIT 18880, 20
/* Result : "20 rows fetched ( 0,41 sec)" */
Min Query :
SELECT * FROM s_dk WHERE Domain LIKE '%a%' OR Domain LIKE '%b%' OR Domain LIKE '%c%' ORDER BY (IF(Domain LIKE '%a%', 1, 0) + IF(Domain LIKE '%b%', 1, 0) + IF(Domain LIKE '%c%', 1, 0)) DESC LIMIT 18880, 20
/* Result : "20 rows fetched ( 0,34 sec)" */
Min er faktisk en smule hurtigere, men det har helt sikkert noget at gøre med hvor meget der bliver hentet.
Jeg er enig - i min udgave beregner MySQL score for hver eneste række i tabellen; i din sandsynligvis kun for de rækker der rent faktisk bliver udtrukket.
For et større resultatsæt er det mit gæt at
SELECT *, IF(Domain LIKE '%a%', 1, 0) AS score FROM s_dk HAVING score > 0 ORDER BY score DESC LIMIT 18880, 20
vil være en anelse hurtigere end
SELECT * FROM s_dk WHERE Domain LIKE '%a%' ORDER BY IF(Domain LIKE '%a%', 1, 0) DESC LIMIT 18880, 20
SELECT *, IF(Domain LIKE '%a%', 1, 0) + IF(Domain LIKE '%b%', 1, 0) + IF(Domain LIKE '%c%', 1, 0) AS score FROM s_dk HAVING score > 0 ORDER BY score DESC LIMIT 23000, 1000;
/* Result : "1000 rows fetched ( 0,44 sec)" */
Min Query :
SELECT * FROM s_dk WHERE Domain LIKE '%a%' OR Domain LIKE '%b%' OR Domain LIKE '%c%' ORDER BY (IF(Domain LIKE '%a%', 1, 0) + IF(Domain LIKE '%b%', 1, 0) + IF(Domain LIKE '%c%', 1, 0)) DESC LIMIT 23000, 1000;
Jeg mente nu ikke "mange rækker i LIMIT", men mange rækker der hvor MySQL skal beregne score for hver række den finder. Det var derfor min udgave kun begrænser på "a" og ikke "a" + "b" + "c". LIMIT skulle holdes konstant for sammenligning med de andre resultater.
Men spørgsmålet er, om forskellen overhovedet er målbar, jvfr. de resultater du allerede har vist - 0,05s kan vel ikke være meget mere end forskellen på at vente på at disken lige drejer sig en enkelt gang ekstra for at få læse/skrivehovedet frem til rette sted...
Tak for kompetent hjælp... mht. tiderne absolut er det hvad man kan forvente af MySQL..?? Jeg bikser med at prøve det samme på min MSSQL, men jeg ved ikke om jeg kan slå cache'n fra.
Du kan sikkert lave noget mere tuning, pille ved buffere osv. Men hvad du skal gøre herfra kommer helt an på scenariet (forventede mængder af data i produktionsudgaven, forventet antal samtidige brugere, hvilken hardware har du tilgængelig, osv)
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.