MySQL データベースを実行しており、すべてのテーブルが InnoDB である
毎晩、バッチ スクリプトを介して電子メールで送信される、最も問題のあるスロー クエリのリストを受け取ります。
このリストには、挿入と更新の 2 つのクエリがあります。
挿入スクリプトは、ユーザーのページ ビューをログに記録します。これをより効率的にするために、セッション内のユーザーに対して一度だけ挿入を書き込みます。そのため、セッションで表示されたページを保存し、ページの読み込み時に in_array を実行します。ページが配列にない場合は、挿入を書き込みます。
このテーブルには、唯一のインデックスが主キー (id) である 700,000 以上のレコードがあります。
このテーブルへの挿入は次のようになります。
insert into page_views (user_id,page_name,created)
values ('4','Test Page','2013-08-13 10:44:21')
このクエリは、スロー クエリ ログに時間がかかるものとして表示されます。私の質問は、これをより効率的にするにはどうすればよいかということです。これが、データベースの実行速度が遅い理由の一部であるように感じます。
また、約 14,000 件以上のレコードを持つ InnoDB テーブルで実行される更新クエリもあります。更新は、ユーザーが特定のレコードを初めて表示し、viewed='YES' というタイトルのフィールドを設定したときに発生します。
update test_table set viewed='YES' where id=55
この更新は、スロー クエリ ログにも表示されます。このテーブル「test_table」には、約 (5) 個の異なるインデックスがあります。
#
スロークエリログからの出力
カウント:165(0.35%)時間:2252.210041 s合計、13.649758秒、2.026723秒から313.311842秒の最大(8.96%)95%の時間:1181.480258 S合計、7.573591 s Avg、2.026723 s(49.99961 s) ) : 合計 12.722 ミリ秒、平均 77、最大 38 ~ 233 (0.04%) ロックの 95%: 合計 11.681 ミリ秒、平均 75、最大 38 ~ 84 送信された行: 平均 0、最大 0 ~ 0 (0.00%) 検査された行:平均 0、最大 0 ~ 0 (0.00%) データベース: ユーザー: XXXXX@localhost: クエリの 100.00% (165)、全ユーザーの 99.76% (46921)
クエリの要約: SET タイムスタンプ = N; INSERT INTO page_views (user_id, page_name, created) VALUES ('S', 'S', 'S')1;
page_views のテーブル構造
id (int) 主キー page_name (varchar(255)) 作成日時
非常に大きなテーブルで単純な挿入と更新を高速化するためのオプションは何ですか?