За последние 24 часа нас посетили 55039 программистов и 1777 роботов. Сейчас ищут 859 программистов ...

Что быстрее будет работать?

Тема в разделе "Прочие вопросы по PHP", создана пользователем jasper, 25 июн 2010.

  1. jasper

    jasper Активный пользователь

    С нами с:
    21 фев 2009
    Сообщения:
    45
    Симпатии:
    0
    10000 запросов в mysql с одним параметром, например, WHERE id='1'.
    или 1 запрос с 10000 вариантами?, например, WHERE id='1' OR id='2 OR id='3' и т.к.,
    понятно что во стором случае много оперативы съест, интерисует вопрос в скорости.
     
  2. Volt(220)

    Volt(220) Активный пользователь

    С нами с:
    11 июн 2009
    Сообщения:
    1.640
    Симпатии:
    1
  3. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    Длина условия почти не влияет на скорость выполнения запроса, если это простое условие без всяких там подзапросов.
     
  4. jasper

    jasper Активный пользователь

    С нами с:
    21 фев 2009
    Сообщения:
    45
    Симпатии:
    0
    у меня интересный момент был:
    есть прога, принцип работы такой: есть база товаров (от поставщиков 70тыс.) и есть база товаров(инет. магаз. 70 тыс.), необходимо в цикле брать один товар из базы инет магаза и сравнивать в цикле со всей базой баставщиков, причем получается 2 цикла, один в другом, бирем 70тыс и каждый товар сравниваем еще с 70 тыс. получается 70 тысяч раз по 70 тыс раз. И на данный момент работает так, посылается в цикле около 70000 запросов в базу на получение товара из одной таблицы по id, потом еще 70тыс. для получения из другой таблицы производителя для этого товара по этому же id в этом же цикле. И так работает нереально долго, несколько дней.... жесть.
    Решил ускорить, заменил 70000 запросов на один (для выборки товаров), а потом в цикле так же выбирал для каждого товара производителя (теже 70 тыс.). В итоге работа скрипта стала еще на 30 % дольше... вот я и задумался почему?
     
  5. Kreker

    Kreker Старожил

    С нами с:
    8 апр 2007
    Сообщения:
    5.433
    Симпатии:
    0
    Из крайности в крайность. Почему нельзя делать по 100 условий и 100 запросов?
    PHP:
    1. <?php
    2. for ($hundred= 1; $hundred <= 100; $hundred++) {
    3.  $sql = '.... where id > '.(($hundred-1)*100).' and id<='.($hundred*100);
    4.  //Запрос к базе
    5.  //В цикле сверяем каждый товар
    6.  //Очищаем результат работы mysql free result
    7. }

    Не хватало оперативки.
    Много времени уходило на перегон большого объема данных хард -> оперативка -> хард. ИМХО.
     
  6. jasper

    jasper Активный пользователь

    С нами с:
    21 фев 2009
    Сообщения:
    45
    Симпатии:
    0
    пробовал не 70т. прокручивать, а 1000 и одним запросом и в цикле, так вот всеровно на 30% одним медленнее, так что дело уже не в оперативе... не пойму как быть? и если кто в курсе, как правильно в теории построить поиск и сопоставление товаров... 2 базы по 70 тыс. как их сравнить.
     
  7. Костян

    Костян Активный пользователь

    С нами с:
    12 ноя 2009
    Сообщения:
    1.724
    Симпатии:
    1
    Адрес:
    адуктО
    jasper
    да вставляй по одной да и всё в одном цикле, если сравнения именно по иду, если есть такой же он и не вставиться, нах сравнивать?
     
  8. Volt(220)

    Volt(220) Активный пользователь

    С нами с:
    11 июн 2009
    Сообщения:
    1.640
    Симпатии:
    1
    jasper
    Выбрать товар с поставщиком - join.

    Сравнить два списка товаров - А как сравниваются товары?
     
  9. jasper

    jasper Активный пользователь

    С нами с:
    21 фев 2009
    Сообщения:
    45
    Симпатии:
    0
    нет сравнения не по id, а по названию, например
    str1="C702";
    str2="A-Data 8GB USB Flash Drive (C702) || Black USB2.0";
    кому интересно могу выложить функцию сравнения.
     
  10. jasper

    jasper Активный пользователь

    С нами с:
    21 фев 2009
    Сообщения:
    45
    Симпатии:
    0
    сейчас изменил конструкцию запроса с вида WHERE id='1' OR id='2 OR id='3' на как здесь писали where id in(1,2,3,....) в итоге по скорости 1 в 1 как когда запросы идут в цикле... в общем причел к тому с чего начинал.
     
  11. Костян

    Костян Активный пользователь

    С нами с:
    12 ноя 2009
    Сообщения:
    1.724
    Симпатии:
    1
    Адрес:
    адуктО
    а нафига тогда where по иду не пойму?
     
  12. jasper

    jasper Активный пользователь

    С нами с:
    21 фев 2009
    Сообщения:
    45
    Симпатии:
    0
    все сложнее, просто связка товаров с категориями идет в отдельной таблице, это движек joomla, так вот надо сначала выбрать id товаров которые относятся к определенной категории, потом из другой таблицы вытащить названия товаров по id и из третей таблици вытащить id поставщика и из четвертой таблицы вытащить название поставщика по id поставщика... вот такая связь.. конечно лучше все сделать с JOIN как тут рекомендовали, но я пока не знаю как это сделать и не знаю как это существенно или нет будет влиять на скорость.
     
  13. Костян

    Костян Активный пользователь

    С нами с:
    12 ноя 2009
    Сообщения:
    1.724
    Симпатии:
    1
    Адрес:
    адуктО
    jasper
    ага, вытянуть та вытянешь, я посмотрю как ты адекватно будешь пользовательский ввод сравнивать... вот тут то тебе и жопа
     
  14. jasper

    jasper Активный пользователь

    С нами с:
    21 фев 2009
    Сообщения:
    45
    Симпатии:
    0
    не совсем понял... если имеется ввиду сравнение строк... то написал функцию... % на 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;
    }
     
  15. jasper

    jasper Активный пользователь

    С нами с:
    21 фев 2009
    Сообщения:
    45
    Симпатии:
    0
    здесь даже вопрос не как лучше сравнивать, а как быстрее т.к. те совпадения которые находятся меня на 90 % устраивают.
     
  16. Kreker

    Kreker Старожил

    С нами с:
    8 апр 2007
    Сообщения:
    5.433
    Симпатии:
    0
    Фак мой мозг. Вот это функция...

    В PHP есть встроенные функции для сравнения текста, типа http://ru.php.net/manual/en/function.levenshtein.php
    Посмотри и сравни, может та встроенные функции будет в разы быстрее работать, да и точнее.

    Да и вообще, что с чем она сравнивает? Не уж то все названия из базы тянуться и сравниваются с введенным?
     
  17. jasper

    jasper Активный пользователь

    С нами с:
    21 фев 2009
    Сообщения:
    45
    Симпатии:
    0
    Не уж то все названия из базы тянуться и сравниваются с введенным?
    Да именно так... пробовал разные функции ничего нормально не сравнивает, а эта более менее ... она работает так:
    есть 2 строки, из них вырезаются все символы круто цифр, русских и англ. букв, сортируются, далее пробелы заменяются на .* в итоге ищется первая строва во второй, если нет совпадения, то вторая ищется к первой.
    т.к. например есть в базе поставщиков товар ASUS N51 R213 а у нас сравниваемый товар выглядет так, ASUS N51 R213 ноутбук красного цвета, естественно вторая строка в первой не найдется, но найдется первая во сторой это совпадение подходит. Если искать совпадения каждого слова, получается много мусора.
     
  18. Костян

    Костян Активный пользователь

    С нами с:
    12 ноя 2009
    Сообщения:
    1.724
    Симпатии:
    1
    Адрес:
    адуктО
    jasper
    да и вообще пока пишешь на форуме уже б давно сделалось..
     
  19. jasper

    jasper Активный пользователь

    С нами с:
    21 фев 2009
    Сообщения:
    45
    Симпатии:
    0
    что сделалось? если синхронизация то это делать надо постоянно каждый день и ждать несколько дней нет возможности
     
  20. Kreker

    Kreker Старожил

    С нами с:
    8 апр 2007
    Сообщения:
    5.433
    Симпатии:
    0
    Теперь я понимаю, почему очень часто в магазинах поиск вешает сайт...
     
  21. jasper

    jasper Активный пользователь

    С нами с:
    21 фев 2009
    Сообщения:
    45
    Симпатии:
    0
    у меня не поиск так работает... а синхронизация товоров на сайте с товарами в базе поставщиков...
    Kreker видимо ты знаешь как сделать лучше, подскажи как сделать, если не сложно.. посмотрел еще раз функцию которую ты давал... не подходит мне, если в одна строка 100 символов, другая 6, то как найти совпадения? т.е. как пользоваться этой функцией... ну выведет она 94...
     
  22. Kreker

    Kreker Старожил

    С нами с:
    8 апр 2007
    Сообщения:
    5.433
    Симпатии:
    0
    Пока не знаю, но сам хочу узнать. Сейчас просто занят, в перерывах флужу тут.
     
  23. Kreker

    Kreker Старожил

    С нами с:
    8 апр 2007
    Сообщения:
    5.433
    Симпатии:
    0
    Что из себя представляют базы? Они находятся на одном сервере? Может можно с помощью JOIN объединить, а не вытягивать всю таблицу поставщиков в php каждый раз?
    Тут очень много вариантов для оптимизации. Нужно знать конкретику: структуру таблиц, как связываются столбцы, столбцы для сравнения, само сравнение.
    Может выйти и так, что выгоднее выбрать из таблицы производителей id | company_name. Тогда массив с производителями будет занимать до 5 мегабайт памяти. После нахождения совпадения, нужно вытянуть оставшиеся данные из базы.

    Да и вообще не понятно, с какой целью все это делается. Частота таких операций?

    Для определения узких мест поставь везде таймеры, замерь потребление памяти.
     
  24. Костян

    Костян Активный пользователь

    С нами с:
    12 ноя 2009
    Сообщения:
    1.724
    Симпатии:
    1
    Адрес:
    адуктО
    глупости это всё по 70кусков стравнениями кучей строк синхронизировать, у каждого товара должны быть одинаковые уники в обоих базах, а иначе очень геморный черезжоп каждый день на сервере будет происходить...
     
  25. jasper

    jasper Активный пользователь

    С нами с:
    21 фев 2009
    Сообщения:
    45
    Симпатии:
    0
    насчет черезжоп, согласен, просто иначе никак не сделать, во всяком случае я не смог додуматься.
    Вообщем дело такое:
    есть около 300 прайсов от разных поставщиков из них вытягивается название товара и цена... все это заливается в базу по мере пополнения прайсов заливаются новые и обновляются старые, с этим ппроблем нет делается по несколько сек на 1 прайс... в итоге накопилась база около 70 т. и все время пополняется, далее, есть инет магаз с забитой номенклатурой, названия товаров везде разные, например, один и тот же товар может отображаться по разному в магазе asus e51-67-N4, в разных прайсах может быть asus e51/67/N4, asus e51*67*N4 красный ноутбук и т.д. вот и нужно сопоставить товары в магазе с теми где есть совпадения в прайсах, т.е. один ко многим, у меня все работает и меня устраивает на 90% как все сопоставляется и выбирается...единственная проблема очень медленно...
    to Krecker: сравниваются только названия товаров, поставщики из мазага вытаскиваются только для того что бы его вырезать из названия товара, т.к. в названии товара замешено название поставщика.