Предположим, у нас есть большая таблица 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 так нравится? спасибо.
Просто создать несколько подключений к базе данных и выдавать запросы в вопрос. –
Я предполагаю, что id является первичным ключом или имеет индекс. Вы пробовали «EXPLAIN», чтобы проверить, действительно ли он выполняет сканирование таблицы? –
@HongTat Да 'id' является первичным ключом. Я покажу медленный журнал запросов в mysql. – hahakubile