実行中の完全なSQLが表示されないため、適切なインデックスを推奨できません。 DELETEステートメントにのみ述語がlast_activity
カラム即ち
DELETE FROM `sessions` WHERE last_activity <= 'somevalue' ;
にある場合しかし、DELETEステートメントの性能は、おそらく、例えば、somevalue
の先頭列に索引を追加することによって改善されます
CREATE INDEX sessions_IX1 ON sessions (last_activity);
また、このテーブルがMyISAMストレージエンジンを使用している場合、DML文は同時に実行できません。 DML文は、表に対する排他ロックを取得するのを待つ間にブロックされます。 InnoDBストレージエンジンは行レベルのロックを使用するため、一部のDML操作は同時に実行できます。 (InnoDBがロック競合を排除しないが、ロックが行とインデックスブロックではなく、テーブル全体になります。)
をも記憶する(MySQLデータベース以外の)異なるストレージメカニズムを使用して検討しWebサーバーの "セッション"の情報を取得します。
また、220万の「セッション」行を維持する必要がありますか(何らかの要件がありますか)。これらの行がすべて実際に必要であると確信していますか?そのデータの一部が履歴であり、現在のWebサーバーセッションをサポートするために特に必要がない場合、履歴データを別のテーブルに移動することを検討することがあります。
あなたの最善の策は、データベースセッションを切り、それらをRedisのようなものに保存することです。データベースセッションは、トラフィックが多い場合には適していません。セッションテーブルでこのような書き込み競合が発生します。 – ceejayoz
あなたはそのテーブルをクリアして「死んだ」セッションを削除しますか? –