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

Форум MySQL

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

 

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

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

тема: Поиск по точному совпадению одного какого-нибудь слова
 
 автор: essan   (20.04.2006 в 07:29)   письмо автору
 
 

Замучался я совсем. Подскажите, а лучше поправьте. Мне необходимо чтобы поиск находил полное соответствие(буква в букву) слова. Именно слова а не всего содержимого ячейки. Например в поле есть ячека где записано: Улица разбитых фонарей. Надо так чтоб поиск нашел в случае если в строке поиска было набрано хотя бы одно слово, полностью совпадавшее. Например если набрать: Улица фонариков либо Улицы фонарей, то результат должен быть, так как есть полное соответствие в словах Улица и фонарей, а если слово обрезанное или неправильное окончание, то результата не должно быть, как например Улиц или фон.

$searchfor = preg_replace("/\s/", "|", trim($searchfor));
$searchfor = preg_replace("/^|$/", "'", $searchfor);

if($searchfor!=''){
if ($ser!=actor) {$sql_query = "SELECT * FROM movie WHERE title REGEXP (".$searchfor.") and catalog LIKE '%$ser%'";}
else {$sql_query = "SELECT * FROM movie WHERE actor LIKE (".$searchfor.")";}

$result = mysql_query($sql_query);
$results = mysql_numrows($result);


while ($rows = mysql_fetch_array($result))
{
//выводит найденное поле
}

   
 
 автор: cheops   (20.04.2006 в 11:16)   письмо автору
 
   для: essan   (20.04.2006 в 07:29)
 

Можно поступить следующим образом
<?php 
  
for($i 0$i count($searchfor); $i++) $searchfor[$i] = " (actor LIKE '".$searchfor[$i]."') ";
  
$sql_query "SELECT * FROM movie 
                WHERE actor "
.implode("OR",$searchfor);
?>

   
 
 автор: hars   (05.07.2006 в 09:03)   письмо автору
 
   для: cheops   (20.04.2006 в 11:16)
 

Та-же ситуация,только мне надо сравнить поля в Базе данных,
если конкретно,то надо сравнивать данные такого вида:
01.01.1965 и 1965
это будет условием,пока запрос неправилино написан:

UPDATE 1fizik_face,face 
  SET 
  1fizik_face.vod_udost=concat(face.ser_vd," ",num_vd), 
  1fizik_face.dat_vyd_vod=face.dat_vyd, 
  1fizik_face.stazh=face.stazh 
where 1fizik_face.fio=CONCAT(face.fam,",",face.name,",",face.otch)
  AND data_rozhd like "%face.dat_rozhd";     

Таблица 1fizik_face 6 гигабайт.
face 400 мегабайт

   
 
 автор: hars   (05.07.2006 в 09:44)   письмо автору
 
   для: hars   (05.07.2006 в 09:03)
 

Запрос работает.

UPDATE tests,face 
SET 
tests.name1=concat(face.ser_vd," ",num_vd),
tests.name2=face.dat_vyd
where tests.fio=CONCAT(face.fam,",",face.name,",",face.otch) and locate(tests.n1,face.dat_rozhd,2);

На тестовой таблице tests где всего пять строчек запись обновлялась почти 4 минуты,нужен более быстрый способ.Подскажите пожалуйста что нужно использовать.

   
 
 автор: cheops   (05.07.2006 в 10:01)   письмо автору
 
   для: hars   (05.07.2006 в 09:44)
 

Хм... чего-то много... это локальная машина? Как время замеряли?

   
 
 автор: hars   (05.07.2006 в 10:04)   письмо автору
 
   для: cheops   (05.07.2006 в 10:01)
 

время замерял глянув на часы,то есть примерно.
Да,пока локальная машина.

   
 
 автор: Trianon   (05.07.2006 в 10:04)   письмо автору
 
   для: hars   (05.07.2006 в 09:44)
 

а в таблице face сколько строк?
Есть ли индексы, и на каких столбцах?

   
 
 автор: hars   (05.07.2006 в 10:10)   письмо автору
 
   для: Trianon   (05.07.2006 в 10:04)
 

В таблице face 3475455 строк,строки по которым идёт выборка проиндексированы

   
 
 автор: cheops   (05.07.2006 в 10:38)   письмо автору
 
   для: hars   (05.07.2006 в 10:10)
 

Три с половиной миллиона текстовых записей с функциями в WHERE-условиями... тогда нормально. У вас тип данных у полей face.fam,face.name,face.otch какой и как глубоко они индексированы?

   
 
 автор: hars   (05.07.2006 в 10:48)   письмо автору
 
   для: cheops   (05.07.2006 в 10:38)
 

face.fam,face.name,face.otch тип varchar ,т.к. места маловато ,
проиндексированы ,не уникальны,длина 15

   
 
 автор: hars   (05.07.2006 в 11:36)   письмо автору
 
   для: hars   (05.07.2006 в 10:48)
 

Немного поправил запрос,но время опять же 4.32 (минут),хотя обновлние вносил в таблицу где всего 5 записей ,а мне надо сделать тоже самое,только там их 10 миллионов.

UPDATE tests,face SET 
 tests.name1=concat(face.ser_vd," ",num_vd), 
 tests.name2=face.dat_vyd 
where tests.fio=CONCAT(face.fam,",",face.name,",",face.otch) and locate(tests.n1,face.dat_rozhd,1)>0;

Может,в my.ini что-то надо прописать?(таблицы MyISAM)

   
 
 автор: cheops   (05.07.2006 в 14:10)   письмо автору
 
   для: hars   (05.07.2006 в 11:36)
 

Хм... можно попробовать, у вас сейчас что в my.ini?

   
 
 автор: hars   (05.07.2006 в 15:28)   письмо автору
657 байт
 
   для: cheops   (05.07.2006 в 14:10)
 

Вот мой my.ini,теперь всё перенёс на MySQL5

Все поля учавствующие в условии проиндексированы,не уникальны.
В таблице face 3 500 000 записей,обьём 400 мегабайт.
Вот точный запрос,что и куда внести в эти большие базы

UPDATE 1fizik_face,face 
 SET 1fizik_face.vod_udost=concat(face.ser_vd," ",num_vd),
          1fizik_face.dat_vyd_vod=face.dat_vyd
 where 1fizik_face.sis_fz<10
     and 1fizik_face.fio=CONCAT(face.fam,",",face.name,",",face.otch) 
     and locate(face.dat_rozhd,1fizik_face. data_rozhd,5)>0;

В принципе скрипт заработал,я поставил ограничение на 10 записей в обновляемой таблице и он работал 5минут 51 секунду.Обновил три записи .

   
 
 автор: cheops   (05.07.2006 в 16:44)   письмо автору
 
   для: hars   (05.07.2006 в 15:28)
 

1) Хм... а у вас тип таблиц InnoDB? Если измените на MyISAM будет работать быстрее (возможно даже в несколько раз).
2) Сколько вам можно оттяпать оперативной памяти, т.е. сколько её всего на машине?
3) Чем дольше будет работать скрипт, тем быстрее будет идти дело, так как индексы будут подгружаться в кэш оперативной памяти, его конечно лучше сделать побольше
4) Вот это
tmp_table_size=5M

очень мало, сделайте хотя бы 64М.
5) Вот это тоже не очень много (или оперативной памяти мало у машины)
key_buffer_size=80M

сюда бы 3/4 оперативной памяти машины нужно...

   
 
 автор: hars   (05.07.2006 в 16:47)   письмо автору
 
   для: cheops   (05.07.2006 в 16:44)
 

Спасибо !Сейчас сделаю,памяти к сожалению всего 384 метра.Таблицы MyISAM

   
 
 автор: cheops   (05.07.2006 в 16:46)   письмо автору
 
   для: hars   (05.07.2006 в 15:28)
 

Ещё можно выставить значение
join_buffer_size = 16М

Можно и больше...

   
 
 автор: hars   (05.07.2006 в 18:27)   письмо автору
 
   для: cheops   (05.07.2006 в 16:46)
 

У меня такой вопросик,когда я ставлю условие обновить строки 17<1fizik_face.sis_fz<19,то комп почемуто особо не загружается и похоже вообще ничего не делает,но память под процесс mysqld-nt постоянно растёт,до максимальной отметки в my.ini,странно то что загрузка проца 6-10%,а когда 1fizik_face.sis_fz=18,то сразу заметно :),что процесс пощёл,время его выполнения 33сек.


UPDATE 1fizik_face,face 
 SET 1fizik_face.vod_udost=concat(face.ser_vd," ",num_vd),
          1fizik_face.dat_vyd_vod=face.dat_vyd 
 where 17<1fizik_face.sis_fz<19
     and 1fizik_face.fio=CONCAT(face.fam,",",face.name,",",face.otch)   
     and locate(face.dat_rozhd,1fizik_face. data_rozhd,5)>0;

только что пробовал,до сих пор висит,прошло 3 минуты уже

   
 
 автор: Trianon   (05.07.2006 в 18:39)   письмо автору
 
   для: hars   (05.07.2006 в 18:27)
 

Вам нужно добиться другого способа сопоставления записей.
Например, создать в таблице face еще один столбец с хешем этого самого fio.
Или в другой таблице, если эту стрёмно трогать. В конце концов, есть у нее первичный ключ?
Иначе можно долго так наблюдать MySQLом. Долго и безуспешно.

   
 
 автор: hars   (05.07.2006 в 18:52)   письмо автору
 
   для: Trianon   (05.07.2006 в 18:39)
 

Понял,спасибо.Первичный ключ я не создал,вседа думал что это индекс ,индексировал,но видимо не сростается.

   
Rambler's Top100
вверх

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