Задавайте вопросы, мы ответим
Вы не зашли.
Ситуация такая. Есть таблица, 77 Гб сгенерированная скриптом. В ней нет индексов вообще. Есть в ней одно поле, назовем его keyname, нужно чтобы в этой таблице остались только уникальные записи, но из дублей должна остаться последняя запись, все же остальные удалены.
Самое простое что приходит в голову - делаю еще одну таблицу (t2), аналогичную по структуре, но с уникальным индексом по keyname, затем:
Отредактированно Shopen (30.06.2010 17:14:18)
Неактивен
В голову приходит только то, что оно не зависает, а начинает считать индекс.
Также может, например, кончаться место (в т.ч. и во временном хранилище).
Насколько часто заполняется эта табличка? Может, сразу сделать индекс и
делать REPLACE в нее? Если одноразовая — нет ли там какой-то неявной сор-
тировки (например, не сортированы ли уже строки по ключу физически)?
Неактивен
paulus написал:
В голову приходит только то, что оно не зависает, а начинает считать индекс.
Также может, например, кончаться место (в т.ч. и во временном хранилище).
место нет, не заканчивается. Насчет индекса - если он и считает его, то очень медленно и без какой либо активности процессором. Я бы оставил его считать себе дальше, но из за набегания висящих запросов в temporary table вешается все остальное, а там куча важных сервисов.
paulus написал:
Насколько часто заполняется эта табличка? Может, сразу сделать индекс и
делать REPLACE в нее? Если одноразовая — нет ли там какой-то неявной сор-
тировки (например, не сортированы ли уже строки по ключу физически)?
Можно сделать сразу. Но скрипт который генерит эту БД генерит ее _намного_ дольше. Если без индексов время примерно 12 часов, то с индексами время удваивается. Мне изначально казалось, что генерация без индексов + INSERT + SELECT -должна работать гораздо быстрее, я даже не предполагал что наткнусь на такую проблему.
Если никаких других вариантов не придет в голову, придется так и оставить. Насчет сортировки не понял. Таблица делается с нуля.
P.S. Вот думаю, насколько полезно temp мускуля выносить на отдельный диск/массив? На сервере сейчас три райд массива
1. raid1 (75Gb, SAS),
2. raid10 (600Gb, SAS)
3. raid1 (750Gb, SATA).
mysql лежит на 2 массиве, там же и все БД, там же и его temp. 1 массив - система, 3 - файлопомойка, оба загружены весьма слабо. Имеет ли смысл перенести temp и если да, то на какой - побольше или побыстрее ?
Неактивен
Если сервер ничем не занимается — значит, он чего-то ждет. Смотрите на блокировки
таблиц / процессов. Может, кто-то HUP серверу кидает, еще что-нибудь.
Неактивен
Да в том то и дело, что ничего подозрительного не наблюдается. Буду дальше наблюдать, либо скриптом геренить вместе с индексами...
Есть еще одна мысль. Почему я вставляю в таблицу без индексов - чтобы скрипт отрабатывал как можно быстрее. Скрипт обрабатывает пачку XML-файлов (тысяч десять в каждом по 10 тысяч записей), соответственно по одному запросу на файл INSERT INTO t1 VALUES (),(),(),()... Что если сделать так: сделать 2 таблицы t1 и t2. Первая без индексов, вторая с. На t1 повесить триггер на INSERT, который после получения каждого запроса будет лочить 1 таблицу, переносить во вторую (с индексами), после чего первую чистить. Есть ли шанс, что так будет быстрее, чем просто вставлять в одну индексированную?
А что насчет вопроса про райды?
Неактивен
Быстрее, очевидно, не будет, т.к. Вам надо будет писать в два места
Про рейды — если у Вас есть регулярные запросы, которые создают
временные таблицы на диске, то имеет смысл переделать запросы так,
чтобы не создавали Если переделать не получается (i.e. обработка
всех данных в огромной таблице), то тогда быстрые диски лучше мед-
ленных
Неактивен
paulus написал:
Если переделать не получается (i.e. обработка
всех данных в огромной таблице), то тогда быстрые диски лучше медленных
Это я понимаю. Тут вопрос немного по другому поводу... сейчас все базы данных и временный каталог расположены на самом быстром райде, но при этом ведь происходит чтение и запись с одного носителя одновременно, поэтому и интересно не стоит ли выносить темп пусть даже на более медленный диск, но отдельный. Поставил process monitor, посмотрел чем занимается mysql (немного прифигел от увиденного ). Видимо был неправ, считая что процесс висит - он просто долго туда пишет, а изменения размера происходят нечасто. Но пишет он только в t2.MYD и ни в какие временные таблицы, тогда непонятно почему это мешает другие процессам писать в tmp.
Еще заметил странную вещь - почему то одни временные таблицы создаются в temp/, а другие в каталоге data/ (т.е. в корне) а третьи в каталогах самих баз данных. Отчего так, почему mysql не всегда использует указанный ему каталог для временных файлов?
Неактивен
Временные таблицы создаются во временном каталоге. Таблицы, которые потом
заменят основные таблицы, создаются в каталоге с данными (чтобы mv сработал
быстро), в корне таблицы не создаются.
Неактивен
Ну как, своими глазами наблюдаю:
Date: 07.07.2010 21:04:30 Thread: 664 Class: File System Operation: WriteFile Result: SUCCESS Path: E:\home\mysql\data\#sql_6dc_13.MYD Duration: 0.0074455
Неактивен
Не должен бы. А на каком запросе такое?
Неактивен
Вот вроде бы такой:
Отредактированно Shopen (07.07.2010 21:41:21)
Неактивен
Проверил: временная таблица (create temporary table) у меня создалась в /tmp.
Может, windows-specific?
Неактивен
Тут в процессе занимательной работы с этой БД обнаружил интересный эффект. Есть такой оптимизирующий совет когда делается пачка инсертов в таблицу с инсертами, то нужно делать так
Неактивен
Хм. Совсем не очевидное свойство. DISABLE KEYS не выключает уникальные
индексы. Казалось бы, не должно влиять. Есть смысл описать это на bugs.mysql.com
со словами «бага оптимизатора, который считает, что индекса нет».
Неактивен