Выборка большой базы и SQL запрос

Тема в разделе "Базы данных", создана пользователем casinolot, 12 апр 2012.

Модераторы: latteo
  1. casinolot

    casinolot

    Регистр.:
    22 окт 2010
    Сообщения:
    547
    Симпатии:
    84
    есть таблица с большим количество записей. Как лучше сделать в плане производительности.
    Т.е. человек задает адресс и радиус и ему ищется количество результатов по радиусу, и сортируется по близости к пользователю
    но таблица огромная (вообще-то их 2, первая с исполнителями ,а вторая с адрессами исполнителей т.е долгота широта)
    Если всё записывать в массив и там(в серверном языке) уже считать записи подходящие ,то будет памяти не слабо брать. Может можно как-то отсортироваться на уровне запроса, а также не брать пустые записи.
    Конечно хорошо счетчик использовать COUNT будет не так жрать ресурсы, ну а если эти результаты еще и выводить нужно будет.
    что я пока надумал
    SELECT * FROM vendor WHERE COALESCE(n1,n2,n3,n4) IS NOT NULL AND distance<$distance ORDER BY distance DESC


    хотя * использовать не комильфо по производительности
    где расстояние лучше пересчитывать в php или mysql
     
  2. shaen

    shaen Постоялец

    Регистр.:
    23 июн 2011
    Сообщения:
    51
    Симпатии:
    9
    если есть такая возможность то лучше по средствам mysql

    проиндексируйте все поля по которым производится выборка, * замените на название полей которые необходимо выводить, кешируйте ваши запросы, если Ваш mysql поддерживает хранимые процедуры и триггеры воспользуйтесь ими
     
  3. alex.kirov

    alex.kirov Создатель

    Регистр.:
    18 авг 2010
    Сообщения:
    29
    Симпатии:
    7
    На самом деле, если у вас есть индекс по distance , то операция distance < $distnace довольно "дешевая". Поэтому можете не париться по поводу прозводительности. Если очень много однинаковых запросов, то поставьте memcached и сохраняйте результаты там.
     
  4. Funaki

    Funaki

    Регистр.:
    26 июн 2008
    Сообщения:
    151
    Симпатии:
    16
    если по вашему запросу большая выборка результатов добавьте ещё LIMIT в запрос
     
  5. Soul :)

    Soul :) Постоялец

    Регистр.:
    22 мар 2007
    Сообщения:
    86
    Симпатии:
    9
    Учитывая, что distance прийдется считать на лету, то я бы брал квадрат со стороной радиус, и потом искал все точки, которые попадабт в этот квадрат. (т.е. вместо условия sqr(x1-x2)+sqr(y1-y2)<sqr(radius)) было бы 4 условия на больше/меньше, которые задают нужный квадрат. При таком подходе БД сможет использовать индексы.
     
  6. casinolot

    casinolot

    Регистр.:
    22 окт 2010
    Сообщения:
    547
    Симпатии:
    84
    Короче,кидайте свой идеи дальше.
    Я вот что надумал, сначала индексируется цена(т.к. она всегда есть) делается выборка по условию цены и результат заносится во временную таблицу, чтобы дальше уже с меньшим обьемом данных работать.У каждого исполнителя есть свое положение х и у, но пользователь всегда задает новые, поэтому дистанцию никак заранее не просчитать и поэтому нет значения и нельзя проиндексировать.Затем в эту таблицу используя хранимую процедуру заносим расстояние от точки заданной клиентом и записанными координатами исполнителя. И потом или оставляем как есть и выводим с условием по расстоянию, или удаляем записи с неподходящим расстоянием.
    Вот не знаю какая логика реализации лучше. Может как-то во время создания временной таблицы, сразу же и проверять условие на дальность,а не позднее просчитывать.
     
  7. .WishMaster.

    .WishMaster. Создатель

    Регистр.:
    15 июл 2009
    Сообщения:
    27
    Симпатии:
    0
    Повесить индекс на distance, также на поля n1,n2,n3,n4 либо на все всразу. Добавить ограничение. Не думаю что человеку нужны например все 1000 записей, вполне хватит и 50.