1) У каждого пользователя, поле в таблице, в которое записывать SELECT COUNT WHERE user_id в момент обновления им новости (добавил/удалил/изменил статус). При простых условиях, можно сделать тригер в бд, который это будет делать сам. Не забудь сделать индекс по user_id
2) Да, лучше кешировать это значение. Делается это разными способами, но смысл один - снизить кол-во вызовов SELECT COUNT
SELECT COUNT(id) и даже SELECT COUNT(id) WHERE user_id = на небольшой посещалке не самая тяжелая операция.. Однако, если ты например решишь отсортировать пользователей по кол-ву новостей, например выбрать top 50, то имея доп. поле с кол-вом новостей, сделать это будет гораздо проще..
В общем, ты правильно мыслишь.