私たちは、基本的に私たちは、次のインデックスを持つページ大きなテーブルで挿入時間を改善するにはどうすればよいですか?
id int
page_id int
user_id int
action_type enum(6)
date_created datetime`
上のユーザーアクションをログに記録MySQLのテーブルに次のデータ構造を持っている:
id Primary key
user_id-page_id-date_created unique
page_id-user_id-date_created
user_id
page_id-date_created
私たちの問題は、このテーブルは、現在1.25億行を持っているということです1日に80万回の割合で成長しており、インサートの完了に約2時間かかります。 挿入は、3つの他のテーブルからデータを選択する3つのクエリによって行われます。この時間を改善するために何をすることができますか? mysqlを落として他のデータベースソリューションを試すべきでしょうか?
L.E:フィードバックに基づいて、私は詳細を提供しようとしています。 まず、テーブルはMyISAMです。これらの挿入はcronジョブで毎晩1回行われ、そのデータは削除されません。 ここでは、挿入をどのように扱うのですか。私はbig_tableとしてbigテーブルを参照し、構造が似ているので、3つのテーブルのそれぞれはcontent_tableになります。説明は約108.5百万の3つのテーブルの中で最大のものです。まず、私はphpを使用して挿入を開始する必要があるIDを取得します。
SELECT id FROM content_table WHERE date_created > "2012-04-18" ORDER BY id ASC LIMIT 1;
+-----------+
| id |
+-----------+
| 107278872 |
+-----------+
1 row in set (3 min 15.52 sec)
EXPLAIN SELECT id FROM content_table WHERE date_created > "2012-04-18" ORDER BY id ASC LIMIT 1;
+----+-------------+------------------+-------+---------------+---------+---------+------+------+-------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+------------------+-------+---------------+---------+---------+------+------+-------------+
| 1 | SIMPLE | content_table | index | NULL | PRIMARY | 4 | NULL | 1 | Using where |
+----+-------------+------------------+-------+---------------+---------+---------+------+------+-------------+
1 row in set (0.06 sec)
(私はそれを得るために非インデックス付きクエリの3分でOKです)そして、このIDを使用すると、私は
INSERT IGNORE INTO big_table (user_id, page_id, type, date_created)
SELECT user_id, page_id, IF (is_admin,"admin_action","action") as type, created_time FROM content_table WHERE id >= "107278872";
を次のようにしますと、ここで選択したルックスのために説明する方法を説明します
EXPLAIN SELECT user_id, page_id, IF (is_admin,"admin_action","action") as type, created_time FROM content_table WHERE id >= "107278872";
+----+-------------+------------------+-------+---------------+---------+---------+------+--------+-------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+------------------+-------+---------------+---------+---------+------+--------+-------------+
| 1 | SIMPLE | content_table | range | PRIMARY | PRIMARY | 4 | NULL | 777864 | Using where |
+----+-------------+------------------+-------+---------------+---------+---------+------+--------+-------------+
1 row in set (0.00 sec)
ように私はまた、phpMyAdminの中でそれを試してみたし、周りの0.004sの時間はので、私はそれは時間ではなく、データのフェッチを取るの挿入だと思いました。サーバーについて知っているのは、クアッドコアxeon @ 2.4 ghzと16 GBのRAMですが、私はストレージについて何も知らない(私はその情報を持ってすぐに戻ってくるだろう)ということです。データはログには使用されません。ユーザーがページ、グループ化などで最もアクティブだったような統計を必要とするだけで、ユーザーはこれらの間隔を指定できます。
あなたは何が時間がかかるか知っていますか?他のテーブルやインサート自体から選択していますか? –
これは単にログとして機能する場合は、データベースではなく単純なファイルに置くことを考えなければなりません。しかし、どのようにデータを使用するかによって異なります。 – Sirko
挿入前のインデックスを削除してから再構築してください。 –