----- Original Message -----
> From: "Reindl Harald" <h.rei...@thelounge.net>
> 
> well i guess you have to sit out add the key
> wrong table design having an id-column without a key or
> something weird in the application not using the primary
> key for such operations

For high-volume insert-only tables the lack of a key could be intentional; with 
the obvious downside that any non-insert operations are going to complete in 
O(fuck).

Adarsh, I suggest you first work out whether the lack of a primary key was 
intentional. If you decide that it is safe to add one (and that you actually do 
want one), your "fastest" route is going to be creating a second table 
identical to the original one but with the addition of the appropriate primary 
key, insert-select-ing the data you want to retain and switching out the tables 
as per Ananda's suggestion. That'll take rougly the same time as your delete 
operation (well, a bit more for the index build) but you now have a fully 
defragmented table with an index.

If, however, you find that adding a key is undesireable, I still recommend 
(also as per Ananda's suggestion) that you recreate and switchout the table.

You can't do it atomically, unfortunately - DML statements like "rename table" 
are never part of a larger transaction and can also not be executed while the 
affected tables are locked. Make sure to check wether no inserts have happened 
between the copy and the rename - shouldn't, really, if you type the commands 
as a single colon-divided line; but check anyway. Ideally, of course, clients 
are not even connected while performing this.

All of the above, however, is only relevant if you need to delete a LOT of the 
data (say, over half) - the create/insert path is going to have to write the 
full records to disk, which is much slower than just marking records as deleted 
in the existing table. If you are only going to delete a (relative) handful of 
records, just delete them and be done with it.

As for the segmented delete, I'm not sure that's going to be useful here. 
There's no usable keys, so regardless of how much records you delete, the table 
is going to be fully scanned anyway. I suspect that segmented deletes are going 
to yield only a fractional speed benefit, but multiply the total time by the 
number of segments you've cut the delete into.


-- 
Bier met grenadyn
Is als mosterd by den wyn
Sy die't drinkt, is eene kwezel
Hy die't drinkt, is ras een ezel

-- 
MySQL General Mailing List
For list archives: http://lists.mysql.com/mysql
To unsubscribe:    http://lists.mysql.com/mysql?unsub=arch...@jab.org

Reply via email to