Поиск по ~16 миллионам строк + кросс поиск по 3 миллионам строк

thenexus

Новичок
Поиск по ~16 миллионам строк + кросс поиск по 3 миллионам строк

Добрый день товарищи ;)

Помогите решить проблему... пол года мучался так и не получилось сделать это так.. что бы работало моментально.
Такая задача:

Это я пытался сделать сайт для магазина автозапчастей, там вбиваешь код запчасти и все выводится моментально, пример тут - www.partcar.ru пример кода - 0336255000 (только он не ищет через кросс базу, не нашел нужный код).

Суть - поиск по прайсам загруженные в базу данных, строк прайсов более 16-ти миллионов, строк в кросс базе около 3-х миллионов.

Есть 2 таблицы prices и cross

prices имеет следующие ячейки:

id, key, search_key

key - список кодов через любой специальный символ (если можно то - "|" ) (может быть до 7ми штук) оригенального вида. Тоесть например 033-6255-000 этот со всякими тире и т.п. что есть по мимо цыфр - код оригенального вида, а код состоящий только из цифр это...

search_key - список кодов через тот же специальный символ, это поисковой код... когда в базу заносится прайс, все что вносится в key - очищается от всего кроме букв и цыфр и заносится в эту ячейку.



cross имеет следующие ячейки:

id, search_key, key

search_key - тут может быть только ОДИН код.

key - тут тоже может быть только ОДИН код. Щас объясню в чем суть этих двух ячеек.


И так. Вот мы вводим код в форму поиска и нажимаем искать, что происходит:

1. Введенный код (далее $code) в форму очищается от всех лишних символов кроме букв и цыфр
2. Затем этот $code начинает поиск по таблице prices по ячейкам search_key и выводит на сайт в таблицу все что нашел (причем выводит данные ИМЕННО из ячейки key (не забывайте что в этой ячейке есть до 7-ми кодов (может быть и один код, три, шесть, сколько угодно до семи через специальный символ).
3. Затем $code идет в кросс базу и ищет по ячейке search_key совпадения.
4. Если находит, то берет код ИМЕННО из ячейки key и начинает такой же поиск как в пункте 2. (этот код тоже имеет ТОЛЬКО цыфры и буквы).
5. И так, пока не пройдет всю кросс базу (в кросс базе может быть найдено НЕСКОЛЬКО совпадений).
все.

Можно другой подход (не знаю, Вам виднее, что я только не пробовал, просто подаю идею, и я уверен что кто то из вас уже такое вообще делал).
Введеный $code сначало идет в таблицу cross и собирает все совпадения в например массив, и потом все что найдет ищет по таблице prices и выводит на сайт.

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

Зарание очень благодарю ;)

ICQ - 5188444
 

zerkms

TDD infected
Команда форума
покажи пример медленного запроса

telepat: LIKE '%foobar%' это плохо
 

thenexus

Новичок
щас хорошо... если найду... ну тут в принцыпе и так все понятно...

это код 2-го варианта который я описал =)

if($_POST['key'])
{
$cross_keys = array();

# Цикл-Массив таблицы cross
$r=mysql_query("select * from `cross` where `key` = '".$_POST['key']."'");
for($i=0; $i<mysql_num_rows($r); $i++)
{
$f=mysql_fetch_array($r);

$cross_keys[]=$f['search_key'];

$likes.=" or `search_key` LIKE '%|$f[search_key]|%'";
}

echo $likes.'<hr>';

$r=mysql_query("select * from `prices` where `search_key` LIKE '%|$_POST[key]|%' $likes");
for($i=0; $i<mysql_num_rows($r); $i++)
{
$f=mysql_fetch_array($r);

echo $f[key].'<br>';
}

}





затем всякий HTML и

<?php

for($i=0; $i<count($cross_keys); $i++)
{
echo '<TR><TD>'.$cross_keys[$i].'</TD><TD>'.$_POST['key'].'</TR>';
}

echo 'Найдено '.$i.' строк в кросс базе';
?>
 
Сверху