Todos los demás artículos son buenas sugerencias. Una más es esta: No use el estado de sesión si no lo necesita en absoluto.
Almacenamiento de sesión en una base de datos es (generalmente) una mala idea para un par de razones simples:
El uso típico de sesión es para no tener que cargar los datos comunes desde el servidor de base de datos varias veces. Si la sesión se almacena en el servidor de db, bueno, realmente no has logrado mucho.
La sesión debe ser serializada y deserializada para cada ejecución de página. Esto significa que los datos de la sesión tendrían que ser recuperados del servidor, y escritos en el servidor cada carga de página independientemente de si la usas o no.
En mi experiencia, es mucho mejor que simplemente saque los datos de su servidor de base de datos cuando realmente lo necesite. En la mayoría de los casos, las personas ponen todo tipo de datos de corta duración en sesión simplemente porque creen que están resolviendo un problema de rendimiento, cuando en realidad lo están empeorando.
Además, si limita la cantidad de datos hacia abajo (por ejemplo, a una identificación de usuario, nombre o algo similar), entonces puede almacenar eso en un cliente de cookies cifradas y no tener que preocuparse por nada.
MemCache es una opción; pero una vez más, consideraré seriamente el uso de su base de datos y veré si puede ajustar las consultas y los esquemas primero.
+1 por la mención de memcached –