mysql - 如何并行扫描一个大的mysql表?

标签 mysql sqoop full-table-scan

假设我们有一个很大的 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/

相关文章:

Azure 表存储 - 表扫描的速度有多快?

sql - 优化大型子表的日期查询 : GiST or GIN?

MySQL SELECT JSON 数组中的所有 ids 和子 ids

PHP Mysql If 语句不起作用

php - 像 Ã 这样的字符在 MySQL 中无法正确显示

java - 是否可以在 Java 中使用 SQOOP 从 MySQL 读取/写入 Hadoop 作业?

mysql - sqoop连接mysql出错

hadoop - sqoop 从 netezza 失败 - "java.lang.ArrayIndexOutOfBoundsException"

mysql - 为 MySQL 表生成数据

使用 count() 执行全表扫描的 MySQL View