В таблице более 200 тыс. Строк, загрузка скрипта занимает более 20 секунд - PullRequest
2 голосов
/ 28 февраля 2012

Я редактировал сценарий для компании, которая разработала это приложение специально для своего бизнеса, теперь они пришли ко мне и захотели обновить его. Все приложение написано на PHP и MySQL, за исключением пары скриптов Python для ежедневного импорта 200 тыс. Записей в базу данных. Моя проблема в том, что мне нужно разрешить классифицировать и редактировать заметки для каждой записи в зависимости от типа события. Единственный способ сделать это - встроить URL в каждую запись, поскольку это единственное действительно уникальное значение. Успешно выяснил это, но теперь скрипт страницы загружается вечно (24 секунды).

Может ли кто-нибудь помочь мне оптимизировать этот фрагмент кода?

$notesq = mysql_query("SELECT * FROM `campaign_event_detail_v2` WHERE `call_recording_url`<>'' AND `event_type_name`='Call'") or die(mysql_error());
while($cnD = mysql_fetch_array($notesq)) {
$callid=$cnD[0];
$getD = mysql_query("SELECT campaign_notes.note, campaign_categories.category FROM campaign_notes LEFT JOIN campaign_categories ON campaign_notes.cid = campaign_categories.cid WHERE campaign_notes.cid='".$cnD['call_recording_url']."' OR campaign_categories.cid='".$cnD['call_recording_url']."'");
$getData = mysql_fetch_row($getD);
    mysql_query("UPDATE `campaign_event_detail_v2` SET `note`='".$getData[0]."',`category_id`='".$getData[1]."' WHERE `id`='".$callid."'");

}

Ваша помощь очень ценится!

Спасибо, J

Ответы [ 4 ]

0 голосов
/ 28 февраля 2012

Примерно так:

SELECT campaign_notes.note, 
   campaign_categories.category 
FROM campaign_event_detail_v2 AS detail
LEFT JOIN campaign_notes ON campaign_notes.cid = detail.call_recording_url 
LEFT JOIN campaign_categories ON campaign_notes.cid = campaign_categories.cid 
          AND campaign_notes.cid = detail.call_recording_url
WHERE detail.call_recording_url<>'' 
AND detail.event_type_name='Call'
AND campaign_notes.cid IS NOT NULL -- filters any from campaign notes that are empty
AND campaign_categories.cid IS NOT NULL -- filters any from campaign categories that are empty;

Это извлекает ссылки из заметок, категорий и фильтров, соответствующих call_recording_url.Затем он отфильтровывает все, что не совпадает в левом соединении (проверка пуста).Если это все еще слишком медленно, есть другие способы оптимизации.Тогда вы сможете выполнить цикл и выполнить оператор обновления.

Я бы также попытался проиндексировать идентификаторы, к которым вы присоединяетесь, особенно call_recording_url, если это строка, для поиска которой требуется больше времени.

0 голосов
/ 28 февраля 2012

Похоже, вы могли бы улучшить этот запрос:

SELECT campaign_notes.note, campaign_categories.category
FROM campaign_notes
LEFT JOIN campaign_categories
  ON campaign_notes.cid = campaign_categories.cid
WHERE campaign_notes.cid = {$cnD['call_recording_url']}
  OR campaign_categories.cid = {$cnD['call_recording_url']}

К этому:

SELECT campaign_notes.note, campaign_categories.category
FROM campaign_notes
LEFT JOIN campaign_categories
  ON campaign_categories.cid = campaign_notes.cid
WHERE campaign_notes.cid = {$cnD['call_recording_url']}
0 голосов
/ 28 февраля 2012

Я думаю, вы можете справиться с этим в одном запросе:

UPDATE campaign_event_detail_v2 d
LEFT JOIN campaign_notes n ON n.cid = d.call_recording_url
LEFT JOIN campaign_categories c ON c.cid = n.cid
SET d.note = n.note, d.category_id = c.category
WHERE d.call_recording_url != '' AND d.event_type_name = 'Call'

Я не на 100% уверен, что это правильная логика, насколько я понял. Я должен извиниться, если это не так. Но моя точка зрения такова: вы, вероятно, можете сделать все это одним запросом.

Вам, вероятно, следует добавить индексы в столбцы, такие как event_type_name, category_id и cid, если их там еще нет. Это не повлияет на ваши сценарии, но выполнение займет некоторое время, в зависимости от того, сколько записей у вас есть в ваших таблицах.

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

0 голосов
/ 28 февраля 2012

Я бы создал хранимую процедуру для этого, и я бы создал несколько новых индексированных зависимостей от запрашиваемых (например, один индекс для: call_recording_url, event_type_name).

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...