SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 09.07.2012 11:13:31

VladimirPivovar
Завсегдатай
Зарегистрирован: 26.04.2011
Сообщений: 31

Индексация миллиардов записей

Поставил на выходные выполнение создания индексов для двух полей типа VARCHAR(32)
После выходных индексация так и не завершивась,
MySQL клиент выдал сообщение "Потеряна связь с MySQL Server". Но процесс как висел в памяти так и висит
Обьем файла MYD = 68 ГБ; количество записей - 1млрд 440 млн... версия MySQL 5.5.25
Загрузка процессора составляет около 20-30%
Посоветуйте  пожалуйста как настроить MySQL для более быстрой  индексации и чтобы она была  выполнена на 100%

Отредактированно VladimirPivovar (09.07.2012 11:56:55)

Неактивен

 

#2 09.07.2012 13:21:36

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3878

Re: Индексация миллиардов записей

Какой движок? MyISAM или Innodb? В каком состоянии висит процесс в SHOW FULL PROCESSLIST? (см. тему http://webew.ru/posts/2699.webew )

Неактивен

 

#3 09.07.2012 15:56:40

VladimirPivovar
Завсегдатай
Зарегистрирован: 26.04.2011
Сообщений: 31

Re: Индексация миллиардов записей

движок - MyISAM

в my.ini не была прописана временная директория

Запустил следующий SQL запрос :


ALTER TABLE mytable ADD KEY(phoneNumberA,phoneNumberB);
 

пока скорость записи во временные файлы, которые лежат с текущей базой остается одинаковой, в папке tmpdir создались 4 временных файла (пустые)

Папка tmpdir находится в том же каталоге что и сам MySQL Server

В вашей презентации вы приводили данные по построению индекса и по поиску с использованием индекса ( 2.8 млрд строк обемом 81 GB)
Построение индекса заняло почти 3 часа, как мне убедиться что индекс правильно строится?
Обьем временных файлов должен будет составить обьему самой базы данных?
Можите пожалуйста привести кусок конфигурации из своего My.ini файла

Отредактированно VladimirPivovar (09.07.2012 17:02:00)

Неактивен

 

#4 09.07.2012 16:59:45

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3878

Re: Индексация миллиардов записей

А "SHOW FULL PROCESSLIST" что показывает?

Неактивен

 

#5 09.07.2012 17:03:46

VladimirPivovar
Завсегдатай
Зарегистрирован: 26.04.2011
Сообщений: 31

Re: Индексация миллиардов записей

показывает, что копирует данные во временную таблицу с выполнением запроса ALTER TABLE mytable ADD KEY(phoneNumberA,phoneNumberB)

Неактивен

 

#6 09.07.2012 17:06:45

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3878

Re: Индексация миллиардов записей

Как только копирование прекратится (это займет несколько часов) состояние должно смениться на "Repair by sorting" (при правильных настройках)

Неактивен

 

#7 09.07.2012 17:08:19

VladimirPivovar
Завсегдатай
Зарегистрирован: 26.04.2011
Сообщений: 31

Re: Индексация миллиардов записей

Обьем временных файлов должен будет равняться обьему самой базы данных?

Неактивен

 

#8 09.07.2012 17:11:32

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3878

Re: Индексация миллиардов записей

Может быть больше. Сначала создается копия таблицы и начинает создаваться индекс (его объем также сравним с объемом данных). Кроме того, нужно место в tmpdir, которое в видимом размере файлов не проявляется, но необходимо. Поэтому рекомендуется иметь места в 3 раза больше, чем размер таблицы + индекс.

Неактивен

 

#9 09.07.2012 18:43:22

VladimirPivovar
Завсегдатай
Зарегистрирован: 26.04.2011
Сообщений: 31

Re: Индексация миллиардов записей

Все равно медленно создаются временные файлы, а файлы из папки tmpdir (их 4) пустые.
Загруженность процессора около 20%
Индексируются поля типа VARCHAR(32)

Отредактированно VladimirPivovar (09.07.2012 18:44:55)

Неактивен

 

#10 09.07.2012 22:52:03

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3878

Re: Индексация миллиардов записей

Файлы в tmpdir формально нулевого размера, но занимают место. Загрузка процессора 20% из-за того, что в основном нагружен диск.

В Percona Server есть некоторая оптимизация создания индексов (может немного помочь):

http://www.percona.com/doc/percona-serv … ation.html
http://www.mysqlperformanceblog.com/201 … -creation/

Неактивен

 

#11 10.07.2012 00:18:18

VladimirPivovar
Завсегдатай
Зарегистрирован: 26.04.2011
Сообщений: 31

Re: Индексация миллиардов записей

Можно как то подсчитать время индексации?  и от каких параметров  в my.ini сильно зависит индексация?

Неактивен

 

#12 10.07.2012 00:32:42

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3878

Re: Индексация миллиардов записей

Посчитать только эмпирически, на основании времени индексации более маленьких таблиц. Зависит от того, есть ли уже индексы и от производительности диска.

Неактивен

 

#13 10.07.2012 16:24:04

VladimirPivovar
Завсегдатай
Зарегистрирован: 26.04.2011
Сообщений: 31

Re: Индексация миллиардов записей

На следующее утро размер временных таблиц при индексации составил всего лишь 2,5 ГБ , а вся база занимает около 90 ГБ.
Такое ощущение что индексация выполнялась еще медленнее.

Вы проиндексировали за 2 часа 52 минут почти 3 млрд строк (правда у вас поля типа INT только встречались), вот как Вам это удалось? smile

Неактивен

 

#14 10.07.2012 17:51:41

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3878

Re: Индексация миллиардов записей

У меня все было в стандартной конфигурации, проблема была только в нехватке места в tmdir. В таблице были только INT и индексы были короткие. Если индексируете varchar - индексы могут быть длинными и это влияет негативно. Посмотрите на кодирову - надеюсь, что она latin1, иначе длина индекса будет в 3 раза больше.

Неактивен

 

#15 10.07.2012 18:00:22

VladimirPivovar
Завсегдатай
Зарегистрирован: 26.04.2011
Сообщений: 31

Re: Индексация миллиардов записей

кодировка cp1251

Неактивен

 

#16 10.07.2012 18:13:02

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3878

Re: Индексация миллиардов записей

тоже однобайтовая, подойдет. Может быть создавать префиксный индекс на 10-16 символов. С какой целью создаете составной индекс из двух телефонов?

Неактивен

 

#17 10.07.2012 18:24:57

VladimirPivovar
Завсегдатай
Зарегистрирован: 26.04.2011
Сообщений: 31

Re: Индексация миллиардов записей

вобще мне достаточно VARCHAR(18-20) а я заревервировал VARCHAR(32) может это критично
мне надо сделать выборку по одному(двум) телефонам за определенного время

Неактивен

 

#18 10.07.2012 18:35:32

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3878

Re: Индексация миллиардов записей

Изучите префиксные индексы и составные индексы. Составной индекс, который вы описали не позволит выбирать по второму телефону, например. Для этого нужно два одинарных, а не один составной. Префиксный индекс позволит проиндексировать только первые 12 байт строки. Не забудьте NOT NULL, так как это сокращает длину индексов.

Неактивен

 

#19 10.07.2012 23:49:02

VladimirPivovar
Завсегдатай
Зарегистрирован: 26.04.2011
Сообщений: 31

Re: Индексация миллиардов записей

Составной индекс, который вы описали не позволит выбирать по второму телефону, например.
Для этого нужно два одинарных, а не один составной.

Спасибо!
А как быть с временем? правильно ли  будет создавать два составных индекса   дата и номерА; дата и номерВ?
Или же 3 отдельных индекса создавать (дата,номерА номерВ) ?

Отредактированно VladimirPivovar (10.07.2012 23:50:43)

Неактивен

 

#20 10.07.2012 23:53:58

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3878

Re: Индексация миллиардов записей

Вторая часть составного индекса используется только если первые части совпадают. Поэтому индексировать время в одном индексе с телефоном не имеет смысла.

Неактивен

 

#21 17.07.2012 09:48:27

VladimirPivovar
Завсегдатай
Зарегистрирован: 26.04.2011
Сообщений: 31

Re: Индексация миллиардов записей

Подскажите пожалуйста,  как создавать новые разделы через каждые n записей в MySQL используя механизм partitioning?
Хочу, чтобы после вставки каждой 25 миллионной записи создавался новый раздел (может надо какой то счетчик заводить).
Поле id не присутствует.
Есть поля типа datetime ( в unixtimestamp ), поле offset(0..220 000 000).
Поле offset меняет свое значение с 0 до 300 000 000 при считывании нового бинарного файла

На данный момент имею таблицу с количеством записей = 2.7 млрд. Из нее хочу данные разнести по разделам в другую таблицу. Вставлял пока вручную, но потом данные будут вставляться автоматически по расписанию. Поэтому надо задать оптимальный критерий создания разделов в автоматическом режиме.

Отредактированно VladimirPivovar (17.07.2012 10:56:49)

Неактивен

 

#22 17.07.2012 18:04:35

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3878

Re: Индексация миллиардов записей

Автоматически разделы в таблицах MySQL не создаются. Можно их создать заранее по автоинкрементальному полю.

Неактивен

 

#23 18.07.2012 20:08:57

VladimirPivovar
Завсегдатай
Зарегистрирован: 26.04.2011
Сообщений: 31

Re: Индексация миллиардов записей

Есть возможность в MySQL 5.5 задать создание разделов по годам и по месяцам для любой даты?
Если да то как, чтобы не надо было жестко задавать для конкретного года создавать 12 подразделов:


CREATE TABLE tbtestpart (
userId int(10) unsigned NOT NULL,
dataTime datetime NOT NULL,
dataValue varchar(45) NULL,
PRIMARY KEY (userId,dataTime)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
PARTITION BY RANGE( YEAR(dataTime) )
SUBPARTITION BY HASH( MONTH(dataTime) ) SUBPARTITIONS 12
(
PARTITION p_2010 VALUES LESS THAN (2010),
PARTITION p_2011 VALUES LESS THAN (2011),
PARTITION p_2012 VALUES LESS THAN (2012),
PARTITION p_max VALUES LESS THAN MAXVALUE
);
 

Неактивен

 

#24 18.07.2012 23:16:05

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3878

Re: Индексация миллиардов записей

Не совсем понял в чем проблема. Вы привели вполне работающий код.

Неактивен

 

#25 19.07.2012 00:08:12

VladimirPivovar
Завсегдатай
Зарегистрирован: 26.04.2011
Сообщений: 31

Re: Индексация миллиардов записей

Тут жестко забиты значения от 2010 и т д.  Можно как-то задать не указывая значений? Или так нельзя, если наступит год, значения которого нет в скрипте - нужно создавать новый раздел самописным скриптом через ALTER TABLE?

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson