1,000 万行未満の大きな mysql テーブルがあるとします。
すべての結果を選択したい場合は、明らかに完全なテーブル スキャンが正常に機能します。
select * from table_name;
しかし、それを並行して行う方法は?Sqoop で解決策が見つかりましたSplit
。
select * from table_name where id >= 1 and id < 10000;
select * from table_name where id >= 10000 and id < 20000;
select * from table_name where id >= 20000 and id < 30000;
...
問題は、id size number
大きな mysql がそれをFull table scan
.
Update1 : スロー クエリ ログ
# Query_time: 600.632844 Lock_time: 0.000071 Rows_sent: 624 Rows_examined: 236584
SELECT `id`, ... FROM `table_name` WHERE ( `id` >= 647121 ) AND ( `id` <= 765101 );
Update2:説明
+----+-------------+------------------+-------+---------------+---------+---------+------+------+-------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+------------------+-------+---------------+---------+---------+------+------+-------------+
| 1 | SIMPLE | table_name | range | PRIMARY | PRIMARY | 4 | NULL | 1 | Using where |
Update3 : Mysql バージョン
+------------+
| version() |
+------------+
| 5.1.46-log |
+------------+
そして、そのようなクエリを 3 つ同時に送信すると、サーバーのクエリ時間が長くなり、耐えられなくなります。
では、分割クエリを並行して実行することは可能ですか? そうでない場合、なぜ Sqoop はこのようなことをするのでしょうか? どうも。