假设我们有一个很大的 mysql 表,其行数少于 1000 万行。
如果我想选择所有结果,显然全表扫描就可以了。
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可能会将其视为全表扫描
。
更新1:慢查询日志
# 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 );
更新2:解释
+----+-------------+------------------+-------+---------------+---------+---------+------+------+-------------+
| 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会这样做呢?谢谢。
最佳答案
看起来它没有使用任何键。您使用的是相当旧的 MySQL 版本吗?
EXPLAIN
应与此类似:
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE table_name range PRIMARY PRIMARY 4 NULL 5926 Using index condition
关于mysql - 如何并行扫描一个大的mysql表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21298427/