There are basically two schools of thought about how/when to keyframe.
With the older technique (sometimes referred to as “layering”), you only keyframe the controllers you are animating at a particular point in time and only when keyframes are needed. For example, you start at the root/COG and insert keyframes there on frames 1, 11, 21, then move up the spine and insert keyframes on 5, 16, and so on.
The newer/standard technique these days (which is taught at places such as AnimationMentor) is a pose-to-pose approach, where you consider each pose in its entirety as a single drawing. That is, you firstly go through creating a set of key storytelling poses (blocking pass), where you keyframe every control on every key pose. Then, you perform a few more passes over this adjusting those poses and/or inserting extra keyframes (again on all controls) to flesh out the pose transitions, before finally polishing everything on a control-by-control basis.
This second approach is much better for environments where you need to show work to a director for approval: directors can get a better idea of where you’re taking the shot, and you can retime different parts easier (i.e. simply shuffle all the keyframes on a frame left or right). Also, the benefit of keyframing all controls at once is that you avoid any unwanted surprises should you change the timings on some controls as you’ve captured the entire pose on each frame. The downsides are that: 1) you have more keyframes to sift through when starting polishing; 2) changing the pose on a “static” body part means you now need to propagate the changed pose to adjacent keyframes; 3) if not done right, you can end up with clearly robotic “swing and hold” animation, where you character is clearly just hitting a number of predefined poses one after the other.
Blender supports both of these workflows.
In the early days, it was orientated more towards the first workflow, where you only wanted to minimise the number of keyframes you inserted. In particular, the “Only Needed” keyframing option was added for this very purpose - that is, to help you optimise when keyframes should/needed to be added.
More recently (i.e. during the 2.5 overhaul), the system has been redesigned to optimise more for the pose to pose workflow. For example, the “Summary” channel in the DopeSheet makes it easy to see where what frames the key poses are on, and to retime these. The “Whole Character” Keying Set inserts keyframes for all controllers on a character rig, and can be chosen from the Insert Keyframe (IKEY) menu, just like for Loc/Rot/Scale keyframes (Keying Sets were developed to allow you to choose a bunch of related properties (potentially across different objects) to insert keyframes for at the same time). Finally, to change the pose for some “static” controllers after you’ve already inserted a bunch of keyframes with the old pose, the “Propagate Keys” tool can be used.