|
|
|
| таблица из двух полей
id(автоин) и word (UNIQUE KEY)
Я делаю запрос к базе и пишу word в массив $word[]
Далее в цикле я осуществляю поиск по этому массиву слов, которые нужно добавить, с помощью функции in_array()
Если слово в массиве не найдено, то делаю вставку insert
Вопрос в том, что массив получается достаточно большим - 5000 строк сейчас и он будет увеличиваться. Не быстрее ли будет пропустить поиск и просто каждый раз пытаться вставлять слово без проверки (поиска по массиву), подавив вывод ошибки (ключ UNIQUE не даст вставить повторяющееся значение).
С другой стороны, если слово в массиве будет найдено, то не будет обращения к базе.
Как все-таки лучше? Посоветуйте, пожалуйста. | |
|
|
|
|
|
|
|
для: медведь
(23.10.2008 в 23:48)
| | Ознакомтесь с темой, незнаю насколько это подойдёт для вас,но считывать в массив уж точно не надо. | |
|
|
|
|
|
|
|
для: Valick
(24.10.2008 в 09:44)
| | Ознокомился. Совершенно не то.
А что "считывать в массив уж точно не надо"-то?
Далее в цикле я осуществляю поиск по этому массиву слов, которые нужно добавить, с помощью функции in_array()
Акцент на "слов, которые нужно добавить". Их может быть 5, а может быть 5000000. | |
|
|
|
|
|
|
|
для: медведь
(27.10.2008 в 23:11)
| | >Ознокомился. Совершенно не то.
Плохо ознакомились. Задача Ваша практически один-в-один.
Впрочем дело ваше.
>Далее в цикле я осуществляю поиск по этому массиву слов, которые нужно добавить, с помощью функции in_array()
Если уж решили работать с массивом, так хораните слова в ключах, а не в значениях. isset быстрее in_array() работает по определению.
>Акцент на "слов, которые нужно добавить". Их может быть 5, а может быть 5000000.
А они у вас все в память то как полезут? :)
да ну... | |
|
|
|
|
|
|
|
для: медведь
(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 просто не вернет ошибки, хотя на самом деле она будет. | |
|
|
|
|
|
|
|
для: Евгений Петров
(24.10.2008 в 15:12)
| | >>Выбирать все значения абсолютно не нужно. Можно выбрать одно для проверки - существует или нет.
Вы предлагаете выбирать конкретные значения в цикле? Или как?
>>либо можно воспользоваться оператором REPLACE
Зачем?
>>Ну или на худой конец (не рекомендую) INSERT IGNORE
а @ уже отменили?
Спасибо Вам за ответы, но вопрос был в том, что быстрее:
искать в массиве и вставить, если не найдено
или не искать в массиве, а сразу вставлять | |
|
|
|
|
|
|
|
для: медведь
(27.10.2008 в 23:10)
| | вопрос был в том, что быстрее
быстрее искать, но не в массиве, а в базе. И вставлять только то, что не найдено.
А INSERT IGNORE нужен только для того, чтобы при одновременном добавлении одинаковых слов небыло дубликатов. И это будет быстрее однозначно.
А вот
искать в массиве и вставить, если не найдено
или не искать в массиве, а сразу вставлять
всё зависит от того сколько чего и куда вставлять и искать
да и в погоне за скоростью не забывайте о нагрузке на базу данных, да и сервера вцелом. | |
|
|
|