2014-01-23 4 views
0

Предположим, у нас есть большая таблица mysql, которая имеет менее 10 миллионов строк.Как сканировать большую таблицу 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 так нравится? спасибо.

+0

Просто создать несколько подключений к базе данных и выдавать запросы в вопрос. –

+0

Я предполагаю, что id является первичным ключом или имеет индекс. Вы пробовали «EXPLAIN», чтобы проверить, действительно ли он выполняет сканирование таблицы? –

+0

@HongTat Да 'id' является первичным ключом. Я покажу медленный журнал запросов в mysql. – hahakubile

ответ

0

Похоже, что он не использует никаких ключей. Вы используете довольно старую версию 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 
+0

Это ответ? – zerkms

+0

Извините, я сделал неверное представление об итогах объяснения. alreay Обновлено. – hahakubile

Смежные вопросы