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

casinolot

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


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

если есть такая возможность то лучше по средствам mysql

проиндексируйте все поля по которым производится выборка, * замените на название полей которые необходимо выводить, кешируйте ваши запросы, если Ваш mysql поддерживает хранимые процедуры и триггеры воспользуйтесь ими
 
ELECT * FROM vendor WHERE COALESCE(n1,n2,n3,n4) IS NOT NULL AND distance<$distance ORDER BY distance DESC

На самом деле, если у вас есть индекс по distance , то операция distance < $distnace довольно "дешевая". Поэтому можете не париться по поводу прозводительности. Если очень много однинаковых запросов, то поставьте memcached и сохраняйте результаты там.
 
если по вашему запросу большая выборка результатов добавьте ещё LIMIT в запрос
 
Учитывая, что distance прийдется считать на лету, то я бы брал квадрат со стороной радиус, и потом искал все точки, которые попадабт в этот квадрат. (т.е. вместо условия sqr(x1-x2)+sqr(y1-y2)<sqr(radius)) было бы 4 условия на больше/меньше, которые задают нужный квадрат. При таком подходе БД сможет использовать индексы.
 
Короче,кидайте свой идеи дальше.
Я вот что надумал, сначала индексируется цена(т.к. она всегда есть) делается выборка по условию цены и результат заносится во временную таблицу, чтобы дальше уже с меньшим обьемом данных работать.У каждого исполнителя есть свое положение х и у, но пользователь всегда задает новые, поэтому дистанцию никак заранее не просчитать и поэтому нет значения и нельзя проиндексировать.Затем в эту таблицу используя хранимую процедуру заносим расстояние от точки заданной клиентом и записанными координатами исполнителя. И потом или оставляем как есть и выводим с условием по расстоянию, или удаляем записи с неподходящим расстоянием.
Вот не знаю какая логика реализации лучше. Может как-то во время создания временной таблицы, сразу же и проверять условие на дальность,а не позднее просчитывать.
 
SELECT * FROM vendor WHERE COALESCE(n1,n2,n3,n4) IS NOT NULL AND distance<$distance ORDER BY distance DESC
Повесить индекс на distance, также на поля n1,n2,n3,n4 либо на все всразу. Добавить ограничение. Не думаю что человеку нужны например все 1000 записей, вполне хватит и 50.
 
Назад
Сверху