Dans ce petit article, je vous indique comment corriger les requêtes SQL lentes SELECT GET_LOCK() de la table ci_sessions sur une installation de CodeIgniter.
Que signifient les requêtes lentes SELECT GET_LOCK() sur ci_sessions ?
La table ci_sessions est destiné à stocker les sessions des visiteurs d’un site CodeIgniter. Celle-ci est notamment utilisée quand la session driver est configuré sur database.
Elle permet à CodeIgniter de stocker les informations de sessions de chaque visiteur dans la base de données. Selon les cas, cela peut présenter un avantage ou un désavantage.
Pourquoi la requête SELECT GET_LOCK() est lente ?
En vérité, la requête en elle-même n’est pas lente. Elle est juste suspendue pendant la période de verrouillage. En effet, cette requête fait justement ce qu’il est censé faire : verrouiller la session durant le chargement d’une page.
La constatation de lenteur survient lorsque la requête a été initiée alors qu’un autre chargement de page est en cours : il attend alors que l’autre page ait fini de charger pour obtenir à son tour le verrou sur la table de session.
Vous constaterez alors une entrée de ce type dans votre fichier log slow queries dans MySQL :
# User@Host: codeigniter[codeigniter] @ localhost [127.0.0.1]
# Thread_id: 12345 Schema: codeigniter QC_hit: No
# Query_time: 22.040801 Lock_time: 0.000000 Rows_sent: 1 Rows_examined: 0
# Rows_affected: 0 Bytes_sent: 70
SET timestamp=xxxxxxxxxx;
SELECT GET_LOCK('653407ce5dddb2b0745d76a5f6dc73c0', 300) AS ci_session_lock;
Comment éviter que la requête SELECT GET_LOCK() empêche le chargement simultané des pages ?
Si vous souhaitez permettre à un utilisateur de charger simultanément plusieurs pages, vous devriez songer à utiliser un autre système de stockage de session qui vous permet un accès simultané à celui-ci.
Le plus simple est de basculer sur un stockage de session par fichiers. Pour cela, ajustez les paramètres suivants dans votre fichier de configuration CodeIgniter :
$config['sess_driver'] = 'files'; // was previously 'database'
$config['sess_save_path'] = sys_get_temp_dir();
Vous pouvez également envisager d’utiliser d’autres systèmes de stockage de sessions telles que Memcached ou Redis, notamment si votre application requiert un système de session centralisée.