WN

WN (https://www.wn.se/forum/index.php)
-   Serversidans teknologier (https://www.wn.se/forum/forumdisplay.php?f=4)
-   -   Tabellunderhåll i MySQL (https://www.wn.se/forum/showthread.php?t=8955)

aikon 2005-07-18 20:17

Har en antal tabeller (ganska många egentligen) som byggs på med en ny rad med jämna mellanrum. För att spara diskutrymme och snabba upp access vill jag då och då rensa bort rader ur tabellerna, och då ett antal av de äldsta (första) raderna.

Det blir väl att använda en vanlig DELETE
Kod:

DELETE [LOW_PRIORITY] [QUICK] [IGNORE] FROM tbl_name
    [WHERE where_definition]
    [ORDER BY ...]
    [LIMIT row_count]

Men nu är det så att tabellerna inte har något löpande id eller liknande, eller datum, så jag kan inte använda WHERE för att hitta de äldsta posterna som jag ska ta bort.

Vill höra om det fungerar att använda LIMIT utan WHERE för att åstadkomma detta?

Alltså typ

Kod:

DELETE FROM tbl_name
    LIMIT 200

för att ta bort de första 200 raderna?? Är lite osäker, eftersom referensmanualen säger

Citat:

If you issue a DELETE statement with no WHERE clause, all rows are deleted.
och det vill jag ju inte! ;)

Eller finns något smartare sätt att göra ett sånt här underhåll på?

tydal 2005-07-18 20:25

Du kan använda limit, men utan löpande id eller datum kan du inte vara säker på att rätt rader försvinner. Det är just det här som är anledningen till att man har datum och/eller löpande id.

aikon 2005-07-18 20:34

Var rädd för det. Tabellerna borde som sagt inte se ut så där, men de är skapade i en annan miljö (lokal pc) och när jag lyfte ut detta på webben ville jag hålla tabellerna intakta. Det var det kortsiktigt enklaste då, men nu inser jag att jag borde gjort om strukturen...

Finns något sätt att räkna ut vilka rader som tas bort med en limit utan where? Tabellerna är skapade och först fyllda med rader genom import av en textfil, och därefter har nya rader skapats på normalt sätt med INSERT INTO i SQL.

EDIT: Förresten (utan att läsa på..), kan jag nu i efterhand lägga till ett idfält med auto_increment till dessa tabeller?

aikon 2005-07-18 21:07

Svarar mig själv med ett visst, det går ju utmärkt. :) En ALTER med ADD lägger till ett id och auto_increment numrerar de befintliga raderna snyggt och prydligt från 1 och upp.

Men ett problem är att genom att lägga till ytterligare ett fält så gör jag tabellen 20% större, vilket motverkar själva avsikten med hela proceduren.

Jag skulle tro att en DELETE med LIMIT utan WHERE borde ta bort rätt rader, de första, eftersom det gick att lägga till ett idfält som numrerade raderna i korrekt ordning. Då borde ju även limit ta dem i rätt ordning, tycker man... ;)

Lindahl 2005-07-18 21:25

Fast sen är det ju så att bara för att filen blir större behöver det inte alls betyda att den blir långsammare, det kan vara tvärt om...

aikon 2005-07-18 21:26

Hmm, jo, DELETE med limit tar bort rätt rader, men när man sedan gör en INSERT INTO så hamnar dessa först i de "tomma luckorna". Så kan jag inte ha det. Det verkar som jag måste åstadkomma ett fält med löpande id för att göra detta. Datat är nämligen kronologiskt, och kan inte stoppas in var som helst... Nu får man sota för att man lat tidigare. ;)

aikon 2005-07-18 21:30

Citat:

Originally posted by Baltiz@Jul 18 2005, 21:25
Fast sen är det ju så att bara för att filen blir större behöver det inte alls betyda att den blir långsammare, det kan vara tvärt om...

Japp, i synnerhet om man får ett lämpligt index, men det är diskutrymmet som är det viktiga här. Databasen är MYCKET stor, och växer hela tiden, och trots mitt webbhotells generösa villkor för lagringsutrymme vet jag inte hur länge jag klarar mig utan att köpa mer plats.


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

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