2017-04-23 3 views
-1

私が現在作業しているサイト(Laravel 4.2フレームワーク)が本当に遅い理由を理解しようとしています。データベースの設定と関係があると思います。私は全くプロではないので、問題がどこにあるかを考えてみましょう。show processlist;を実行すると、そのテーブルには最も長い時間を要するすべてのクエリが関係しています。遅いMySQLテーブル

私のsessionsテーブルには約220万レコードあります。ここで

は、例えば絵です:

enter image description here

表構造

enter image description here

はSurerly私が何か間違ったことをやっているか、それが適切にインデックスではありませんか?私は確信が持てません。データベースでは幻想的ではありません。

+0

あなたの最善の策は、データベースセッションを切り、それらをRedisのようなものに保存することです。データベースセッションは、トラフィックが多い場合には適していません。セッションテーブルでこのような書き込み競合が発生します。 – ceejayoz

+1

あなたはそのテーブルをクリアして「死んだ」セッションを削除しますか? –

答えて

1

実行中の完全な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サーバーセッションをサポートするために特に必要がない場合、履歴データを別のテーブルに移動することを検討することがあります。

関連する問題