Клиент хочет скомпилировать кучу данных для своих клиентов из нескольких источников. Я основываюсь на архитектуре сервера 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) Есть ли другие способы ускорить этот процесс?
Если инструкции INSERT терпят неудачу, это приведет к остановке цикла? – dyelawn
Вы можете использовать 'INSERT IGNORE', если вы не хотите, чтобы MySQL вызывал ошибку. – eggyal
есть ли какое-либо преимущество/недостаток для минимизации количества вызовов db путем создания строки доменов, а затем запускать INSERT IGNORE в одной строке вместо каждого отдельного домена? – dyelawn