update_option leaves autoload set to yes forever

Every option row marked autoload = yes is fetched on every single request, as one query that loads the lot into memory. add_option() takes an argument to opt out of that; update_option() does not take one at all, and when it creates a missing row it hands off to add_option() with the default — which is yes.

add_option('shop_import_log', $log, '', 'no');   // created with autoload = no
update_option('shop_import_log', $log);          // fine — the flag is not touched

update_option('shop_feed_cache', $xml);          // creates the row as autoload = yes

So a plugin that only ever calls update_option() — which is most of them — puts everything it stores into the autoloaded set, and a cached feed or an import log ends up being read into memory on every page view forever. There is no API to change the flag afterwards: you either delete_option() and add it back, or update the column directly. Worth checking the total size of the autoloaded rows on any site that has been running a few years; a megabyte in there is not unusual and it is a megabyte on every request.