2015-02-11 4 views
2

Я пытаюсь посмотреть, сколько строк я закончил в текущем пакетном скрипте. Однако, когда я пытаюсь подсчитать строки, он зависает бесконечно (в этой таблице встречается около 100 вставок). Таблица составляет около 3 миллионов строк. Вот что я делаю:Как аппроксимировать подсчет строк mysql

select count(*) from my_table where is_done=1 

Explain, также выглядит довольно хорошо:

explain select count(*) from my_table where is_done=1 

id select_type table type possible_keys key key_len ref rows Extra 
1 SIMPLE mturk_imdbentry ref is_done is_done 1 const 1471833 Using index 

Почему это «замок» происходит, предотвращая меня от получения графа? А потом, во-вторых, как бы я приблизил счет?

+1

Скорее всего, все вставки блокируют стол. Документы предлагают использовать MyISAM. См. Http://dev.mysql.com/doc/refman/5.0/en/concurrent-inserts.html – Phil

+0

@Phil спасибо за это. Думаю, что так оно и есть. Являются ли INSERT обычно быстрее в MyISAM, чем InnoDB, или они относительно эквивалентны? – Hockey127

+0

MyISAM, как правило, лучше для чтения, InnoDB для записи: но если у вас есть только одно соединение (а не производственный сервер), это не имеет большого значения. Просто не забудьте обернуть ваши INSERT в транзакции (для InnoDB) –

ответ

0

Я однажды столкнулся с аналогичной проблемой в Oracle с чрезвычайно большими вставками. Мой обходной путь был что-то вроде этого:

count = 0; 
while(not done) { 
    do insert; 
    if(count mod 1000 = 0) then 
     update count in secondary log table; 
    end if; 
    count = count + 1; 
} 

Если бы я делал 100мм вставки я мог следить за темпами прогресса и дать себе оценку до завершения.

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