With search data, statistics, cache tables, and log messages Drupal databases can get pretty big, but a lot of the data is disposable. Search data can be reconstructed, caches can be rebuilt, and old log messages can be ignored.
More often than I'd like I see issues where Drupal's cron fails or exceeds the time limit. Here is a handy Drush command which will run all cron hooks on your site and the time it takes to run.