2014-01-13 2 views
1

У меня есть таблица с миллиардами строк, которая больше не подходит в памяти.Как улучшить производительность вставки на таблице с миллиардами строк?

Когда я вставляю новые строки навалом, накладные расходы на пересчет первичного индекса убивают производительность. Я должен иметь этот индекс, потому что в противном случае инструкции SELECT будут очень медленными. Но так как вставки имеют случайный порядок, каждая вставленная строка должна записываться в другую область диска.

И поскольку жесткий диск ограничен 200 операций ввода-вывода в секунду, это замедляет вставку при сканировании.

Могу ли я «съесть свой пирог и съесть его» в то же время в этой ситуации? Возможно, создав другую таблицу, в которой данные будут сгруппированы по разному столбцу (с использованием другого первичного ключа)? Но это кажется мне расточительным, и я даже не знаю, поможет ли это ...

Или, может быть, я мог бы использовать какой-то промежуточный стол? Вставьте там 1 000 000 строк и затем вставьте их в целевую таблицу, сгруппированную по первичному ключу?

Я обречен?

EDIT:

Я разделил таблицу по горизонтали.

Когда я удалил первичный ключ в этом поле, который мне нужен, и поместил его в поле автоинкремента, вставки были невероятно быстрыми.

К сожалению, поскольку данные на диске размещены по значению первичного ключа, это убило выбранную производительность ... потому что выбор не запрашивает, основываясь на значении автоинкремента, а скорее на значении PK.

Так что либо я вставляю строки быстро, либо я их быстро выбираю. Разве нет решения, которое могло бы помочь в обоих случаях?

+1

Вы действительно используете целую таблицу записей 1b? Если нет - используйте [горизонтальное разбиение] (http://en.wikipedia.org/wiki/Partition_%28database%29) и разделите таблицу на части. Реализация этого зависит от вашей СУБД (вы отметили два из них) –

+0

Откуда вы знаете, что «накладные расходы на пересчет первичного индекса, убивает производительность»? Разметка звучит так, как надо. –

+2

Используете ли вы SQL Server или MySQL? Пожалуйста, отметьте вопросы соответствующим образом. –

ответ

0

. Когда вы вставляете новую строку каждый раз, она будет индексировать после ввода данных. Это займет больше времени. Вы можете использовать

START TRANSACTION

... Вы г вставить запрос ...

COMMIT

+0

Я использую это, чтобы вставить 50 000-70 000 строк на транзакцию, и это все равно не помогает ... Какова верхняя граница количества строк, которые я мог бы разместить здесь? Возможно, с большими суммами оптимизатор mysql мог бы лучше управлять дисковым IO, поскольку больше строк можно было бы сгруппировать по PK? – user3010273

0

Попробуйте Понравился

mysql_query ("START TRANSACTION");

Ваш запрос вставки

mysql_query ("COMMIT");

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