FAQ |
Kalender |
|
![]() |
#1 | ||
|
|||
Administratör
|
Citat:
Westmans idé om att uppdatera threads med senaste aktiva datum är mycket bättre.
__________________
eldefors.com - Personlig (teknik)-blogg |
||
![]() |
![]() |
![]() |
#2 | ||
|
|||
Klarade millennium-buggen
|
Citat:
Min lösning löser trådskaparens problem, och gör det på ett effektivt, enkelt, lättfattligt, underhållsvänligt och tryggt sätt. Sen får trådskaparen välja själv. |
||
![]() |
![]() |
![]() |
#3 | ||
|
|||
Administratör
|
Citat:
Just p g a av att läslasten är så mycket högre än skrivlasten blir det ett väldigt effektivt verktyg. På ett forum kan du räkna med en ratio på iaf 100:1, även om det oftare hamnar närmare 1000:1. Om du inte vet vad det innebär att läsa resultatet från en EXPLAIN på din query så har du inte en aning om din lösning faktiskt är effektiv efter MySQLs query plan. Om du kör den och läser på om betydelsen av resultatet så kan du lätt inse att din query är väldigt ineffektiv.
__________________
eldefors.com - Personlig (teknik)-blogg |
||
![]() |
![]() |
![]() |
#4 | ||
|
|||
Klarade millennium-buggen
|
Citat:
1 - Garanterad datakvalitet 2 - Det ska verkligen finnas ett upplevt behov dvs det måste föreligga ett kännbart prestandaproblem 3 - Den beräknade prestandavinsten ska vara avsevärd 4 - Kostnaden måste stå i rimlig proportion till den tidsvinst man beräknas göra Jag ger mig aldrig in på optimering ur prestandasynpunkt om det inte finns ett verkligt behov av det, dvs om det är någon som upplever att systemet tar för lång tid att köra. Annars är det rent slöseri med arbetstid. Senast redigerad av Conny Westh den 2013-01-31 klockan 22:32 |
||
![]() |
![]() |
![]() |
#5 | ||
|
|||
Klarade millennium-buggen
|
Jag tänkte även förklara lite hur jag tänkt när jag löste problemet.
Grundprincipen är att dela upp ett stort problem i sina atomära beståndsdelar. Det var ju från början två olika tabeller och man vill ha ut senaste datum grupperat på threadid i var och en av dessa två tabeller. För att hämta ut senaste datum från threads-tabellen så behöver man skriva så här: Kod:
SELECT threadid, MAX(createddate) AS senastedatum from wn.threads GROUP BY threadid Kod:
SELECT threadid, MAX(created) AS senastedatum from wn.posts GROUP BY threadid Sen vill vi bara ha ut det senaste av dessa sammanslagna tabeller och då slår man bara ihop dessa tabeller med en UNION: Kod:
SELECT threadid, MAX(createddate) AS senastedatum from wn.threads GROUP BY threadid UNION SELECT threadid, MAX(created) AS senastedatum from wn.posts GROUP BY threadid Men då får vi fler rader per thread och det vill vi inte ha utan endast ett datum per thread. Då behöver vi göra ytterligare en gruppering. Men Group By funkar bara på EN tabell så vi måste först skapa en enda tabell av denna UNION-statement, vi ger tabellen ett alias som 'x': Kod:
SELECT * FROM ( SELECT threadid, MAX(createddate) AS senastedatum from wn.threads GROUP BY threadid UNION SELECT threadid, MAX(created) AS senastedatum from wn.posts GROUP BY threadid ) x Och sen gör vi bara en gruppering och bakvänd sortering på hela kalaset, så var det fixat, lätt som en plätt: Kod:
SELECT threadid, MAX(senastedatum) as senastedatum FROM ( SELECT threadid, MAX(createddate) AS senastedatum from wn.threads GROUP BY threadid UNION SELECT threadid, MAX(created) AS senastedatum from wn.posts GROUP BY threadid ) x GROUP BY threadid ORDER BY senastedatum DESC; Senast redigerad av Conny Westh den 2013-01-31 klockan 11:27 |
||
![]() |
![]() |
![]() |
#6 | ||
|
|||
Klarade millennium-buggen
|
Det kan ju vara lite smart att lägga upp en StoredProcedure så det blir enkelt att anropa denna procedure om man använder den på fler ställen:
Kod:
-- -------------------------------------------------------------------------------- -- Routine DDL -- Note: comments before and after the routine body will not be stored by the server -- -------------------------------------------------------------------------------- DELIMITER $$ CREATE DEFINER=`root`@`localhost` PROCEDURE `ListOfThreadsByLatestUpdate`() BEGIN SELECT threadid, MAX(senastedatum) as senastedatum FROM ( SELECT threadid, MAX(createddate) AS senastedatum from wn.threads GROUP BY threadid UNION SELECT threadid, MAX(created) AS senastedatum from wn.posts GROUP BY threadid ) x GROUP BY threadid ORDER BY senastedatum DESC; END |
||
![]() |
![]() |
![]() |
#7 | ||
|
|||
Klarade millennium-buggen
|
Kod:
-- -------------------------------------------------------------------------------- -- Routine DDL -- Note: comments before and after the routine body will not be stored by the server -- -------------------------------------------------------------------------------- DELIMITER $$ CREATE DEFINER=`root`@`localhost` PROCEDURE `ThreadsByLatestActiveDate`() BEGIN SELECT threadid, MAX(LatestActiveDate) as LatestActiveDate FROM ( SELECT threadid, MAX(createddate) AS LatestActiveDate from wn.threads GROUP BY threadid UNION SELECT threadid, MAX(created) AS LatestActiveDate from wn.posts GROUP BY threadid ) x GROUP BY threadid ORDER BY LatestActiveDate DESC; END Jag döpte om proceduren och fixade lite testkod i PHP om någon vill provköra proceduren i PHP. Kod:
<?php $host="localhost"; $port=3306; $socket=""; $user="root"; $password="mypassword"; $dbname="wn"; $con = new mysqli($host, $user, $password, $dbname, $port, $socket) or die ('Could not connect to the database server' . mysqli_connect_error()); //$con->close(); $query = "call `wn`.`ThreadsByLatestActiveDate`"; if ($stmt = $con->prepare($query)) { $stmt->execute(); $stmt->bind_result($threadId, $latestActiveDate); while ($stmt->fetch()) { printf("%s, %s\n", $threadId, $latestActiveDate); } $stmt->close(); } ?> |
||
![]() |
![]() |
![]() |
#8 | ||
|
|||
Supermoderator
|
Jag förstår inte hur det kan finnas trådar utan inlägg. Där ligger nog pudelns kärna.
__________________
Jonny Zetterström se.linkedin.com/in/jonnyz | bjz.se | sajthotellet.com | kalsongkungen.se | zretail.se | zetterstromnetworks.se | webbhotellsguide.se | ekonominyheter24.se | nyamobiltelefoner.se | gapskratt.se | antivirusguiden.se | jonny.nu |
||
![]() |
![]() |
Svara |
Ämnesverktyg | |
Visningsalternativ | |
|
|