Как оптимизировать БД (2 Гб. на жестком диске)?
Если в запросах участвуют не сильно много данных (не целиком несколько таблиц, а лишь некоторые колонки), то помогут грамотно проставленные индексы. СУБД индексы кешируют в памяти сами и поиск по ним очень быстр.
Если у вас запросы LIKE по каким-нить большим blob полям, то вероятно структура БД неверная и нужно искомую информацию заранее, на этапе записи, выносить в отдельные столбцы. Тем более что у вас 95% select запросов.
В любом случае от LIKE запросов лучше избавляться, сервер провалится от нагрузок даже если у вас всё в памяти будет лежать. Если это поиск по тексту, то советую посмотреть в сторону поисковых движков, например sphinx.
2Гб база - это не много. 
Нужно смотреть в сторону нормализации модели базы.
Left / Right JOIN запросы не критичны, вот Inner / Outer очень сильно могут подпортить производительность. На моей практике денормализировать и партицировать модель для предотвращения JOIN'ов приходилось только при работе с 30Гб+ табличками. 
Выносить БД на B-tree в память нет смысла, проще использовать Redis или hashtable индексы.
В случае с MySQL у InnoDB есть встроенный кэш для ключей первого порядка...
Вам нужно просто прикрутить нормально кэш второго уровня типа memcached или ehcache и не заморачиваться.
Как сказал @affka полнотекстовые поисковые движки нужны 100%.
Лично мне Sphinx не очень нравится, больше склоняюсь к Solr / Elastic Search и к встроенному полнотекстовому движку PosgreSQL.
Можно почитать это и это.
Для PostgreSQL можно глянуть это
Также желательно помнить про VACUUM и пользоваться pg_reorg для предотвращения блокировок.
В принципе ваши проблемы 100% решаются EXPLAIN'ом и нормальным кэшированием с нормализацией модели.
Шардинги / репликации и партицирование слишком большой геморой если не решены самые элементарные вопросы. Тем более что у MySQL что у PostgreSQL master-master репликация вообще не торт. Это "План Я" для любого проекта.