Может кто поможет с MySQL.
Есть таблица InnoDB в миллион строк:
domain_name varchar(255) - адрес сайта
domain_name_md5 binary(32) primary key - md5 хеш адреса
rank0_date date indexed - дата последнего обновления
rank0 int(4) - позиция на дату последнего обновления
rank1 int(4) - позиция сайта на день раньше
...
rank89 int(4) - позиция сайта за 30 дней до даты последнего обновления
growth_1d int(4) indexed - изменение позиции сайта за последний день
growth_1w int(4) indexed - изменение позиции сайта за последнюю неделю
growth_2w int(4) indexed - - изменение позиции сайта за последние две недели
...
раз в день я обновляю эту таблицы новыми данными: обновляю поля rank0-rank89 и пересчитываю growth_1d и остальные.
делается в питоне.
1. считываю из текст. файла данные о позициях
2. нахожу через select предыдущие данные обрабатываемого сайтаю select * from ranks where domain_name_md5=md5(domain_name)
3. делаю расчеты growth_1d и остальных
4. через update обновляю запись. (или insert если сайта еще нет в базе)
5. каждые 10,000 сайтов делаю commit.
на все это уходит около часа.
нужно быстрее.
что приходит в голову (проверить смогу уже в понедельник) из того, что почитал в инете:
а. убрать primary index c domain_name_md5 - он присоединяется к другим индексам замедляя работу (
http://www.youtube.com/watch?v=u70mkgDnDdU). создать поле domain_id c primary key
б. на шаге 2 не использовать select * - тоже замедляет работу. перечислить все поля.
в. использовать LOAD DATA INFILE (
http://dev.mysql.com/doc/refman/5.1/en/load-data.html). сначала заполнить текстовый файл новыми данными, скормить его LOAD DATA INFILE для создания новой (временной) таблицы. заменить старую таблицу новой.
есть идеи?