2014-11-26 3 views
1

im в настоящее время выполняет запрос, который вытягивает строку из моего db. но он должен проверять каждую новую строку i import. и файл размером 100 тыс. занимает почти 4 часа для импорта. Это слишком долго. im, предполагая, что мой код sql, чтобы проверить, существует ли он, является тем, что замедляет его. ive слышал об индексировании, но я понятия не имею, что это такое или как его использовать.Сделать мой запрос более эффективным

это текущий код им с помощью:

$sql2 = $pdo->prepare('SELECT * FROM prospects WHERE :ssn = ssn'); 
$sql2->execute(array(':ssn' => $ssn)); 
if($sql2->fetch(PDO::FETCH_NUM) > 0){ 

так каждый phpscript читает новую строку, она делает эту проверку. проблема в том, что я не могу положить ее в «дубликат ключа» в код sql. он должен проверить перед переходом на любой sql, потому что, если он пуст, тогда он должен продолжать делать свое дело.

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

+0

Тогда, возможно, чтение немного о [индексов] (http://dev.mysql.com/doc/refman/5.5/en/optimization-indexes. html) было бы хорошим местом для начала –

+0

Индексирование таблицы не связано с PHP. Является ли 'ssn' основным, foreighn ключом или нет? –

+0

SQL основан на «наборах» или наборах строк, и большинство эффективности сосредоточено вокруг этого прецедента. Сбрасывание данных во временную таблицу db и выполнение запроса во всем сразу может привести к лучшим результатам в целом. –

ответ

1

Итак, у вас есть записи 100 000, и у вас нет индекса? Начните затем создать один

CREATE INDEX ssn_index ON prospects (ssn) 

Теперь, каждый раз, когда вы пытаетесь выбрать что-то из prospects таблицы с where условия на ssn колонке MySQL собирается проверить, где он должен искать записи по индексу. Если этот столбец сильно избирателен (существует много разных значений), запрос будет выполнен быстро.

Вы можете проверить свой план выполнения, запрашивая

EXPLAIN SELECT * FROM prospects WHERE :ssn = ssn 
+0

так скажите, что я запустил этот индекс создания, это там навсегда? он обновляется, когда я добавляю новые строки? или вам нужно добавить к индексу? использовать код SQL так же? – Sharpie

+0

Да, он будет храниться вечно и автоматически обновляться. Если вы экспортируете свою базу данных, она также будет экспортирована. –

+0

спасибо, ive добавил индексный ключ в ssn в этой таблице. однако, запрос не чувствует себя быстрее. я все еще пишу один и тот же код sql или каким-то образом меняю его? – Sharpie

Смежные вопросы