Задавайте вопросы, мы ответим
Вы не зашли.
Поставил на выходные выполнение создания индексов для двух полей типа VARCHAR(32)
После выходных индексация так и не завершивась,
MySQL клиент выдал сообщение "Потеряна связь с MySQL Server". Но процесс как висел в памяти так и висит
Обьем файла MYD = 68 ГБ; количество записей - 1млрд 440 млн... версия MySQL 5.5.25
Загрузка процессора составляет около 20-30%
Посоветуйте пожалуйста как настроить MySQL для более быстрой индексации и чтобы она была выполнена на 100%
Отредактированно VladimirPivovar (09.07.2012 11:56:55)
Неактивен
Какой движок? MyISAM или Innodb? В каком состоянии висит процесс в SHOW FULL PROCESSLIST? (см. тему http://webew.ru/posts/2699.webew )
Неактивен
движок - MyISAM
в my.ini не была прописана временная директория
Запустил следующий SQL запрос :
Отредактированно VladimirPivovar (09.07.2012 17:02:00)
Неактивен
А "SHOW FULL PROCESSLIST" что показывает?
Неактивен
показывает, что копирует данные во временную таблицу с выполнением запроса ALTER TABLE mytable ADD KEY(phoneNumberA,phoneNumberB)
Неактивен
Как только копирование прекратится (это займет несколько часов) состояние должно смениться на "Repair by sorting" (при правильных настройках)
Неактивен
Обьем временных файлов должен будет равняться обьему самой базы данных?
Неактивен
Может быть больше. Сначала создается копия таблицы и начинает создаваться индекс (его объем также сравним с объемом данных). Кроме того, нужно место в tmpdir, которое в видимом размере файлов не проявляется, но необходимо. Поэтому рекомендуется иметь места в 3 раза больше, чем размер таблицы + индекс.
Неактивен
Все равно медленно создаются временные файлы, а файлы из папки tmpdir (их 4) пустые.
Загруженность процессора около 20%
Индексируются поля типа VARCHAR(32)
Отредактированно VladimirPivovar (09.07.2012 18:44:55)
Неактивен
Файлы в tmpdir формально нулевого размера, но занимают место. Загрузка процессора 20% из-за того, что в основном нагружен диск.
В Percona Server есть некоторая оптимизация создания индексов (может немного помочь):
http://www.percona.com/doc/percona-serv … ation.html
http://www.mysqlperformanceblog.com/201 … -creation/
Неактивен
Можно как то подсчитать время индексации? и от каких параметров в my.ini сильно зависит индексация?
Неактивен
Посчитать только эмпирически, на основании времени индексации более маленьких таблиц. Зависит от того, есть ли уже индексы и от производительности диска.
Неактивен
На следующее утро размер временных таблиц при индексации составил всего лишь 2,5 ГБ , а вся база занимает около 90 ГБ.
Такое ощущение что индексация выполнялась еще медленнее.
Вы проиндексировали за 2 часа 52 минут почти 3 млрд строк (правда у вас поля типа INT только встречались), вот как Вам это удалось?
Неактивен
У меня все было в стандартной конфигурации, проблема была только в нехватке места в tmdir. В таблице были только INT и индексы были короткие. Если индексируете varchar - индексы могут быть длинными и это влияет негативно. Посмотрите на кодирову - надеюсь, что она latin1, иначе длина индекса будет в 3 раза больше.
Неактивен
кодировка cp1251
Неактивен
тоже однобайтовая, подойдет. Может быть создавать префиксный индекс на 10-16 символов. С какой целью создаете составной индекс из двух телефонов?
Неактивен
вобще мне достаточно VARCHAR(18-20) а я заревервировал VARCHAR(32) может это критично
мне надо сделать выборку по одному(двум) телефонам за определенного время
Неактивен
Изучите префиксные индексы и составные индексы. Составной индекс, который вы описали не позволит выбирать по второму телефону, например. Для этого нужно два одинарных, а не один составной. Префиксный индекс позволит проиндексировать только первые 12 байт строки. Не забудьте NOT NULL, так как это сокращает длину индексов.
Неактивен
Составной индекс, который вы описали не позволит выбирать по второму телефону, например.
Для этого нужно два одинарных, а не один составной.
Спасибо!
А как быть с временем? правильно ли будет создавать два составных индекса дата и номерА; дата и номерВ?
Или же 3 отдельных индекса создавать (дата,номерА номерВ) ?
Отредактированно VladimirPivovar (10.07.2012 23:50:43)
Неактивен
Вторая часть составного индекса используется только если первые части совпадают. Поэтому индексировать время в одном индексе с телефоном не имеет смысла.
Неактивен
Подскажите пожалуйста, как создавать новые разделы через каждые 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)
Неактивен
Автоматически разделы в таблицах MySQL не создаются. Можно их создать заранее по автоинкрементальному полю.
Неактивен
Есть возможность в MySQL 5.5 задать создание разделов по годам и по месяцам для любой даты?
Если да то как, чтобы не надо было жестко задавать для конкретного года создавать 12 подразделов:
Неактивен
Не совсем понял в чем проблема. Вы привели вполне работающий код.
Неактивен
Тут жестко забиты значения от 2010 и т д. Можно как-то задать не указывая значений? Или так нельзя, если наступит год, значения которого нет в скрипте - нужно создавать новый раздел самописным скриптом через ALTER TABLE?
Неактивен