Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В. PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В. Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Что быстрее in_array или insert с вероятной ошибкой?
 
 автор: медведь   (23.10.2008 в 23:48)   письмо автору
 
 

таблица из двух полей
id(автоин) и word (UNIQUE KEY)

Я делаю запрос к базе и пишу word в массив $word[]
Далее в цикле я осуществляю поиск по этому массиву слов, которые нужно добавить, с помощью функции in_array()

Если слово в массиве не найдено, то делаю вставку insert

Вопрос в том, что массив получается достаточно большим - 5000 строк сейчас и он будет увеличиваться. Не быстрее ли будет пропустить поиск и просто каждый раз пытаться вставлять слово без проверки (поиска по массиву), подавив вывод ошибки (ключ UNIQUE не даст вставить повторяющееся значение).

С другой стороны, если слово в массиве будет найдено, то не будет обращения к базе.
Как все-таки лучше? Посоветуйте, пожалуйста.

  Ответить  
 
 автор: Valick   (24.10.2008 в 09:44)   письмо автору
 
   для: медведь   (23.10.2008 в 23:48)
 

Ознакомтесь с темой, незнаю насколько это подойдёт для вас,но считывать в массив уж точно не надо.

  Ответить  
 
 автор: медведь   (27.10.2008 в 23:11)   письмо автору
 
   для: Valick   (24.10.2008 в 09:44)
 

Ознокомился. Совершенно не то.
А что "считывать в массив уж точно не надо"-то?

Далее в цикле я осуществляю поиск по этому массиву слов, которые нужно добавить, с помощью функции in_array()

Акцент на "слов, которые нужно добавить". Их может быть 5, а может быть 5000000.

  Ответить  
 
 автор: Trianon   (27.10.2008 в 23:47)   письмо автору
 
   для: медведь   (27.10.2008 в 23:11)
 

>Ознокомился. Совершенно не то.
Плохо ознакомились. Задача Ваша практически один-в-один.
Впрочем дело ваше.


>Далее в цикле я осуществляю поиск по этому массиву слов, которые нужно добавить, с помощью функции in_array()
Если уж решили работать с массивом, так хораните слова в ключах, а не в значениях. isset быстрее in_array() работает по определению.

>Акцент на "слов, которые нужно добавить". Их может быть 5, а может быть 5000000.
А они у вас все в память то как полезут? :)

да ну...

  Ответить  
 
 автор: Евгений Петров   (24.10.2008 в 15:12)   письмо автору
 
   для: медведь   (23.10.2008 в 23:48)
 

Выбирать все значения абсолютно не нужно. Можно выбрать одно для проверки - существует или нет. Например так:
<?php

$result 
mysql_query("SELECT TRUE FROM table WHERE word = '" mysql_real_escape_string($new_word) . "' LIMIT 1");

if (
mysql_num_rows($result) == 0) {
    
mysql_query("INSERT INTO table SET word = '" mysql_real_escape_string($new_word) . "'");
}

либо можно воспользоваться оператором REPLACE
mysql_query("REPLACE INTO table SET word = '" . mysql_real_escape_string($new_word) . "'");

только в данном случае поле ID изменится, т.к. этот оператор всегда сначала удаляет запись а потом добавляет новую.
Ну или на худой конец (не рекомендую) INSERT IGNORE
mysql_query("INSERT IGNORE INTO table SET word = '" . mysql_real_escape_string($new_word) . "'");

В данном случае в случае существовани записи MySQL просто не вернет ошибки, хотя на самом деле она будет.

  Ответить  
 
 автор: медведь   (27.10.2008 в 23:10)   письмо автору
 
   для: Евгений Петров   (24.10.2008 в 15:12)
 

>>Выбирать все значения абсолютно не нужно. Можно выбрать одно для проверки - существует или нет.
Вы предлагаете выбирать конкретные значения в цикле? Или как?

>>либо можно воспользоваться оператором REPLACE
Зачем?

>>Ну или на худой конец (не рекомендую) INSERT IGNORE
а @ уже отменили?

Спасибо Вам за ответы, но вопрос был в том, что быстрее:
искать в массиве и вставить, если не найдено
или не искать в массиве, а сразу вставлять

  Ответить  
 
 автор: Valick   (28.10.2008 в 09:00)   письмо автору
 
   для: медведь   (27.10.2008 в 23:10)
 

вопрос был в том, что быстрее
быстрее искать, но не в массиве, а в базе. И вставлять только то, что не найдено.
А INSERT IGNORE нужен только для того, чтобы при одновременном добавлении одинаковых слов небыло дубликатов. И это будет быстрее однозначно.
А вот
искать в массиве и вставить, если не найдено
или не искать в массиве, а сразу вставлять

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

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования