10000 запросов в mysql с одним параметром, например, WHERE id='1'. или 1 запрос с 10000 вариантами?, например, WHERE id='1' OR id='2 OR id='3' и т.к., понятно что во стором случае много оперативы съест, интерисует вопрос в скорости.
1) [sql]where 0<id and id<10001 [/sql] не? 2)[sql]where id in(1,2,3,....)[/sql] 3)Один запрос должен быть быстрее: http://www.php.ru/forum/viewtopic.php?p=205367#205367
Длина условия почти не влияет на скорость выполнения запроса, если это простое условие без всяких там подзапросов.
у меня интересный момент был: есть прога, принцип работы такой: есть база товаров (от поставщиков 70тыс.) и есть база товаров(инет. магаз. 70 тыс.), необходимо в цикле брать один товар из базы инет магаза и сравнивать в цикле со всей базой баставщиков, причем получается 2 цикла, один в другом, бирем 70тыс и каждый товар сравниваем еще с 70 тыс. получается 70 тысяч раз по 70 тыс раз. И на данный момент работает так, посылается в цикле около 70000 запросов в базу на получение товара из одной таблицы по id, потом еще 70тыс. для получения из другой таблицы производителя для этого товара по этому же id в этом же цикле. И так работает нереально долго, несколько дней.... жесть. Решил ускорить, заменил 70000 запросов на один (для выборки товаров), а потом в цикле так же выбирал для каждого товара производителя (теже 70 тыс.). В итоге работа скрипта стала еще на 30 % дольше... вот я и задумался почему?
Из крайности в крайность. Почему нельзя делать по 100 условий и 100 запросов? PHP: <?php for ($hundred= 1; $hundred <= 100; $hundred++) { $sql = '.... where id > '.(($hundred-1)*100).' and id<='.($hundred*100); //Запрос к базе //В цикле сверяем каждый товар //Очищаем результат работы mysql free result } Не хватало оперативки. Много времени уходило на перегон большого объема данных хард -> оперативка -> хард. ИМХО.
пробовал не 70т. прокручивать, а 1000 и одним запросом и в цикле, так вот всеровно на 30% одним медленнее, так что дело уже не в оперативе... не пойму как быть? и если кто в курсе, как правильно в теории построить поиск и сопоставление товаров... 2 базы по 70 тыс. как их сравнить.
jasper да вставляй по одной да и всё в одном цикле, если сравнения именно по иду, если есть такой же он и не вставиться, нах сравнивать?
нет сравнения не по id, а по названию, например str1="C702"; str2="A-Data 8GB USB Flash Drive (C702) || Black USB2.0"; кому интересно могу выложить функцию сравнения.
сейчас изменил конструкцию запроса с вида WHERE id='1' OR id='2 OR id='3' на как здесь писали where id in(1,2,3,....) в итоге по скорости 1 в 1 как когда запросы идут в цикле... в общем причел к тому с чего начинал.
все сложнее, просто связка товаров с категориями идет в отдельной таблице, это движек joomla, так вот надо сначала выбрать id товаров которые относятся к определенной категории, потом из другой таблицы вытащить названия товаров по id и из третей таблици вытащить id поставщика и из четвертой таблицы вытащить название поставщика по id поставщика... вот такая связь.. конечно лучше все сделать с JOIN как тут рекомендовали, но я пока не знаю как это сделать и не знаю как это существенно или нет будет влиять на скорость.
jasper ага, вытянуть та вытянешь, я посмотрю как ты адекватно будешь пользовательский ввод сравнивать... вот тут то тебе и жопа
не совсем понял... если имеется ввиду сравнение строк... то написал функцию... % на 80 выбирает что надо... лучше не знаю как сделать. function sravnit($str1,$str2) { $arr=explode(" ",$str1); natcasesort($arr); $str1=implode(" ",$arr); $arr=explode(" ",$str2); natcasesort($arr); $str2=implode(" ",$arr); $str1=preg_replace("#[^а-яА-Яa-zA-Z0-9\s]#is","",$str1); $str1=trim($str1); $search_str1=str_replace(" ",".*",$str1); $str2=preg_replace("#[^а-яА-Яa-zA-Z0-9\s]#is","",$str2); $str2=trim($str2); $search_str2=str_replace(" ",".*",$str2); $match=0; $pattern1="(?:^|\s)".$search_str1."(?:\s|$)"; $pattern2="(?:^|\s)".$search_str2."(?:\s|$)"; if(preg_match("#".$pattern1."#Uis",$str2)) $match=1; else if(preg_match("#".$pattern2."#Uis",$str1)) $match=1; return $match; }
здесь даже вопрос не как лучше сравнивать, а как быстрее т.к. те совпадения которые находятся меня на 90 % устраивают.
Фак мой мозг. Вот это функция... В PHP есть встроенные функции для сравнения текста, типа http://ru.php.net/manual/en/function.levenshtein.php Посмотри и сравни, может та встроенные функции будет в разы быстрее работать, да и точнее. Да и вообще, что с чем она сравнивает? Не уж то все названия из базы тянуться и сравниваются с введенным?
Не уж то все названия из базы тянуться и сравниваются с введенным? Да именно так... пробовал разные функции ничего нормально не сравнивает, а эта более менее ... она работает так: есть 2 строки, из них вырезаются все символы круто цифр, русских и англ. букв, сортируются, далее пробелы заменяются на .* в итоге ищется первая строва во второй, если нет совпадения, то вторая ищется к первой. т.к. например есть в базе поставщиков товар ASUS N51 R213 а у нас сравниваемый товар выглядет так, ASUS N51 R213 ноутбук красного цвета, естественно вторая строка в первой не найдется, но найдется первая во сторой это совпадение подходит. Если искать совпадения каждого слова, получается много мусора.
что сделалось? если синхронизация то это делать надо постоянно каждый день и ждать несколько дней нет возможности
у меня не поиск так работает... а синхронизация товоров на сайте с товарами в базе поставщиков... Kreker видимо ты знаешь как сделать лучше, подскажи как сделать, если не сложно.. посмотрел еще раз функцию которую ты давал... не подходит мне, если в одна строка 100 символов, другая 6, то как найти совпадения? т.е. как пользоваться этой функцией... ну выведет она 94...
Что из себя представляют базы? Они находятся на одном сервере? Может можно с помощью JOIN объединить, а не вытягивать всю таблицу поставщиков в php каждый раз? Тут очень много вариантов для оптимизации. Нужно знать конкретику: структуру таблиц, как связываются столбцы, столбцы для сравнения, само сравнение. Может выйти и так, что выгоднее выбрать из таблицы производителей id | company_name. Тогда массив с производителями будет занимать до 5 мегабайт памяти. После нахождения совпадения, нужно вытянуть оставшиеся данные из базы. Да и вообще не понятно, с какой целью все это делается. Частота таких операций? Для определения узких мест поставь везде таймеры, замерь потребление памяти.
глупости это всё по 70кусков стравнениями кучей строк синхронизировать, у каждого товара должны быть одинаковые уники в обоих базах, а иначе очень геморный черезжоп каждый день на сервере будет происходить...
насчет черезжоп, согласен, просто иначе никак не сделать, во всяком случае я не смог додуматься. Вообщем дело такое: есть около 300 прайсов от разных поставщиков из них вытягивается название товара и цена... все это заливается в базу по мере пополнения прайсов заливаются новые и обновляются старые, с этим ппроблем нет делается по несколько сек на 1 прайс... в итоге накопилась база около 70 т. и все время пополняется, далее, есть инет магаз с забитой номенклатурой, названия товаров везде разные, например, один и тот же товар может отображаться по разному в магазе asus e51-67-N4, в разных прайсах может быть asus e51/67/N4, asus e51*67*N4 красный ноутбук и т.д. вот и нужно сопоставить товары в магазе с теми где есть совпадения в прайсах, т.е. один ко многим, у меня все работает и меня устраивает на 90% как все сопоставляется и выбирается...единственная проблема очень медленно... to Krecker: сравниваются только названия товаров, поставщики из мазага вытаскиваются только для того что бы его вырезать из названия товара, т.к. в названии товара замешено название поставщика.