2012-04-29 4 views
2

Клиент хочет скомпилировать кучу данных для своих клиентов из нескольких источников. Я основываюсь на архитектуре сервера PHP/MySQL. Весь мой опыт в интерфейсе разработчика и дизайне, поэтому я столкнулся с проблемами производительности, теперь, когда есть много наборов данных.MySQL Database Modeling для больших наборов данных

Проблема с производительностью - это дедупликация. Основная таблица db хранит домены и имеет четыре столбца: «id», «domain_name» и два логических значения, используемые для определения того, является ли домен возможной целью для клиентов. В столбце «domain_name» есть ИНДЕКС.

Я не хочу несколько строк для одного домена. Домены прибывают в наборы 30000, и сейчас я использую:

if(!(Domain::find_by_domain($d->n))) { 
    // insert into db 
} 

Я также попытался:

$already_in_db = Domain::list_domains(); 
if(!in_array($already_in_db)) { 
    // insert into db 
} 

Есть только около 170 000 доменов в таблице прямо сейчас, и оба метода уже занимают очень много времени.

1) Установив УНИКАЛЬНЫЙ ИНДЕКС в столбце домена, вы должны просто отказаться от обмана?

2) Есть ли другие способы ускорить этот процесс?

ответ

2

Сделайте свой индекс на столбце имя домена UNIQUE, то ваши INSERT заявления потерпит неудачу, если домен уже существует (вы можете использовать REPLACE или INSERT ... ON DUPLICATE KEY UPDATE, если вы хотите изменить данные в случае такого столкновения):

ALTER TABLE tbl_name 
    DROP INDEX name_of_existing_index, 
    ADD UNIQUE INDEX name_of_existing_index (domain_name); 
+0

Если инструкции INSERT терпят неудачу, это приведет к остановке цикла? – dyelawn

+0

Вы можете использовать 'INSERT IGNORE', если вы не хотите, чтобы MySQL вызывал ошибку. – eggyal

+0

есть ли какое-либо преимущество/недостаток для минимизации количества вызовов db путем создания строки доменов, а затем запускать INSERT IGNORE в одной строке вместо каждого отдельного домена? – dyelawn