Реклама на сайте Advertise with us

Опять MySQL, сложные запросы и большие объемы данных

Расширенный поиск по форуму
 
Новая тема Новая тема   
Автор
Поиск в теме:



С нами с 06.03.03
Сообщения: 1650
Рейтинг: 1096

Ссылка на сообщениеДобавлено: 20/04/09 в 18:01       Ответить с цитатойцитата 

уважаемые программеры, помогите задачку решить.
есть файл с урлами:
урл1
урл2
урл3
и так далее. урлов может быть в файле много, порядка 300.000
в таблице mysql есть поля domain, url, flag.
записей в таблице дохрена, скажем порядка полутора миллионов.
файл считывается php-скриптом, для каждого урла определяется его домен, и генерируется запрос для мускуля, которым нужно импортировать урлы в таблицу, но не просто вставить, а с условием:

урл не должен добавляться, если в таблице присутствует запись с таким же доменом, и при этом flag=1.
урл не должен добавляться, если такой же урл уже присутствует в таблице.

в остальных случаях (если такого домена (или урла) нет, или домен есть, но flag при этом равен 0) - запись должна быть добавлена.

из этого следует, что поле url должно быть уникальным, а поле domain уникальным быть не может.

каким образом реализовать такую условную вставку, да еще и чтобы работала она максимально быстро?

в принципе, то условие, что изначально урлы в файле - можно заменить на готовую таблицу с неуникальными полями domain и url.

0
 

programmer

С нами с 08.12.02
Сообщения: 7613
Рейтинг: 5760

Ссылка на сообщениеДобавлено: 20/04/09 в 18:10       Ответить с цитатойцитата 

Цитата:
Если в команде INSERT со строками, имеющими много значений, указывается ключевое слово IGNORE, то все строки, имеющие дублирующиеся ключи PRIMARY или UNIQUE в этой таблице, будут проигнорированы и не будут внесены. Если не указывать IGNORE, то данная операция вставки прекращается при обнаружении строки, имеющей дублирующееся значение существующего ключа. Количество строк, внесенных в данную таблицу, можно определить при помощи функции C API mysql_info().

http://www.mysql.ru/docs/man/INSERT.html
+ играемся where

крипта на ByBit

0
 



С нами с 06.03.03
Сообщения: 1650
Рейтинг: 1096

Ссылка на сообщениеДобавлено: 20/04/09 в 18:24       Ответить с цитатойцитата 

where в чистом insert нет. есть в insert .. select .. where, но вот как? where not exists(select count(*) ... ) заставляет задуматься мускуль более чем на 20 минут (дальше вырубил), и это только на таблице с 12к записей...

0
 



С нами с 27.03.09
Сообщения: 155
Рейтинг: 320

Ссылка на сообщениеДобавлено: 20/04/09 в 19:29       Ответить с цитатойцитата 


а зачем "select count(*)"? разве не
INSERT INTO domains
(domain, url, 0)
SELECT url
FROM domain_tmp
WHERE not exists (select * domain_tmp
where domains.url = domain_tmp.url)...
?
правда, для этого придется временную таблицу создавать и закидывать в нее урлы (урл1, урл2) частями.

0
 



С нами с 06.03.03
Сообщения: 1650
Рейтинг: 1096

Ссылка на сообщениеДобавлено: 20/04/09 в 19:53       Ответить с цитатойцитата 

ну потому что написано в мане что where not exists(select count(*)...) специально оптимизируется и выполняется быстрее чем *. но даже так выполняется неприемлимо долго, можно даже сказать виснет. так что вложенные запросы не подходят.

0
 

Чингачгук, вождь красноглазых

С нами с 14.05.04
Сообщения: 4744
Рейтинг: 1824

Ссылка на сообщениеДобавлено: 20/04/09 в 22:49       Ответить с цитатойцитата 

Пардон, но этот топик напоминает лечение глаукомы по фотографии. Когда речь идет о базах в миллионы записей, тут полно "мелочей", которые могут дать разницу на порядки. Подбор типов колонок (там хватает тонкостей), настройка индексов, настройки mysql (кэшей запросов и пр.), выбор бэкенда таблиц. А тут - даже про индексы таблицы ни одного слова, они там вообще есть?

0
 



С нами с 06.03.03
Сообщения: 1650
Рейтинг: 1096

Ссылка на сообщениеДобавлено: 21/04/09 в 02:45       Ответить с цитатойцитата 

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

0
 

SexBlogs.Name

С нами с 13.10.03
Сообщения: 3159
Рейтинг: 962

Ссылка на сообщениеДобавлено: 21/04/09 в 10:51       Ответить с цитатойцитата 

Оффтопик: тоже интересно

Submit your blog to the sex blogs list. PR=3 Quickly approve! 10 posts min. Ping every 6 hour!

0
 

c++,php кодинг

С нами с 22.10.05
Сообщения: 1098
Рейтинг: 558

Ссылка на сообщениеДобавлено: 21/04/09 в 11:36       Ответить с цитатойцитата 

поставь уникальные ключи на

url
domain+flag

и вставляй все без проверок

0
 

c++,php кодинг

С нами с 22.10.05
Сообщения: 1098
Рейтинг: 558

Ссылка на сообщениеДобавлено: 21/04/09 в 11:39       Ответить с цитатойцитата 

либо же сначала сделай селекты по всем урлам из файла,закинь их куда нить, просто в памяти или во временную таблица, потом сбрасываешь индексы на основной и булком пихаешь, восстанавливаешь индексы.

0
 

www.phpdevs.com

С нами с 24.10.02
Сообщения: 16633
Рейтинг: 16105


Передовик Master-X (01.09.2005) Передовик Master-X (16.09.2005) Передовик Master-X (01.10.2005) Передовик Master-X (16.08.2006) Передовик Master-X (16.10.2006) Ветеран трепа Master-X ()
Ссылка на сообщениеДобавлено: 21/04/09 в 11:45       Ответить с цитатойцитата 

Если надо сделать быстро, то делай по совету asgor'а , будет быстрее всего.

Пишу на php/mysql/django за вменяемые деньги.
Обращаться в личку.

0
 



С нами с 06.03.03
Сообщения: 1650
Рейтинг: 1096

Ссылка на сообщениеДобавлено: 21/04/09 в 14:53       Ответить с цитатойцитата 

комрады, ну какие уникальные ключи? прочитайте задачу еще раз. я ж написал - в таблице может быть несколько записей с одинаковым доменом. не было бы этого условия - не было бы вопроса. то что вы мне советуете - сделано уже давно, и сейчас так работает - на уникальных ключах. но условия меняются, и сейчас нужно расширить функционал.
Цитата:
из этого следует, что поле url должно быть уникальным, а поле domain уникальным быть не может.

0
 



С нами с 25.12.03
Сообщения: 1003
Рейтинг: 462

Ссылка на сообщениеДобавлено: 21/04/09 в 15:22       Ответить с цитатойцитата 

добавь поле "домен" с индексом
а чтобы меньше места ело раздели урл на домен и путь

Sutra - лучшая система управления трафом

0
 

c++,php кодинг

С нами с 22.10.05
Сообщения: 1098
Рейтинг: 558

Ссылка на сообщениеДобавлено: 21/04/09 в 17:50       Ответить с цитатойцитата 

в уникальный ключ можно объединить 2 поля (домен+флаг).

Хотя, да, сорри нельзя так сделать. Иначе разные урлы с одним доменом и флагом 0, тоже не будет добавляться.

0
 



С нами с 01.03.07
Сообщения: 304
Рейтинг: 223

Ссылка на сообщениеДобавлено: 22/04/09 в 11:45       Ответить с цитатойцитата 

мож просто смысл этого скрипта скажешь для чего он делается,
может там совсем по другому можно организовать без таких напрягов,
я вот тоже недавно переделывал творение одного "мастера" из 1000 таблиц и в каждой по 10к записей типа рефер и еще всякая байда, так у меня вышла табличка с одними цифрами всего на 100 к записей в день и сервак терь летает не то что раньше. Может ты тоже огород городишь ?

0
 

Чингачгук, вождь красноглазых

С нами с 14.05.04
Сообщения: 4744
Рейтинг: 1824

Ссылка на сообщениеДобавлено: 22/04/09 в 20:40       Ответить с цитатойцитата 

webboxxx писал:
скажем так - считайте что все делается с нуля, и нет еще никаких таблиц и индексов, потому что эту часть скрипта решил переделать основательно, раньше там совсем все по другому работало. так что очень буду благодарен за советы по организации таблиц, подбору типов полей и индексов для них. а также за статьи по тем же аспектам.


Угу. Это называется "научите меня за один топик на MX создавать оптимальные базы". Тут просто либо немного на другой уровень выходить надо, то есть начать с похода в магазин за толстой книжкой по программированию баз данных, читать и думать, узнавать интересные вещи - что такое "нормализация", например. про которую явно не слыхал тут никто, судя по тому, что никого не удивляет, что записи об одинаковых доменах не вынесены в отдельную таблицу с первичным ключом, а лежат в тех же рядах, что и URL'ы... Ну и всякое прочее интересное можно узнать, что поможет потом, потому как если такие проблемы на этапе инсертов.. то что будет, когда к данным начнут интенсивно обращаться?

Это не сарказм. Просто каждый из нас может упереться в свой предел компетентности в какой-то области. Я, например, не стану, если что, разбирать коробку передач на своей машине сам, я поеду к автослесарю нужному. Хотя свечи могу и сам поменять icon_smile.gif))

0
 
Новая тема Новая тема   

Текстовая реклама в форме ответа
Заголовок и до четырех строчек текста
Длина текста до 350 символов
Купить рекламу в этом месте!


Перейти:  



Спонсор раздела Стань спонсором этого раздела!

Реклама на сайте Advertise with us

Опросы

Рецепт новогоднего блюда 2022



Обсудите на форуме обсудить (11)
все опросы »