Я верно понял, что этот пресловутый мегапроизводительный движок, который бьёт битрикс и прочие джумли — это просто вручную написанный MySQL-запрос, который, кстати, другие специалисты рекомендуют переписать?
К тому-же, почему вы решили, что проблемы производительности базы связаны именно с дисковой подсистемой? Как выясняли?
IOPS посмтрел, и какие запросы тормозят диск. Все дело в размере базы под дома. Как я ранее говорил для малькой базы проблемы нету, а вот большой все иначе.
на самом деле, этот пример - классический пример говнокода, вместо того, чтобы оптимизировать запрос, ограничить координаты максимальными и минимальными широтой и долготой окружности, ввести по этим колонкам индекс и довести выполнение запроса до нескольких десятков миллисекунд, он изобретает велосипед, хранит все вычисленные результаты в файлах и в памяти...
Я не пишу говно код, его пишут создатели всяких битриков. Если бы я понимал эту математику с окружностями, долготами и широтой то коненчо написал по другому из начально там был чуть суть был другой запрос я его где в инете нарыл. К сожалению как я писал давном давно в чебох всего 5 программистов моего уровня по PHP и JS и всех их знаю)). Остальные так таковыми не являются по сути они просто дизайнерыс навыками внесения небольших измений в код, подтвержением моих слов то что различные студии годами ищут программистов. А совсем смешно становится когда пытаются найти прогамииста на различные специфичные фрайимворки js типа Node AngularJS.
А если Вы один месяц одному заказчику сайт сделали, потом другому, чему вы научитесь.
Хорошим программистом можно стать т.е дорасти лишь работая с большими проектами, которые пилишь месяцами и годами. У нас в Чебоксарах таких по пальцем одной можно со считать один из них cheb.ru (другие сайты насвязи и их считаю как один).
Сообщение отредактировал relibly - Nov 23 2015, 14:03
Да, индексами отбираем точки, которые попадают в квадрат x0 - r <= x <= x0 + r, y0 - r <= y <= y0 + r . Потом из них те, которые попадают в искомый круг (x0 - x) ^ 2 + (y0 - y) ^ 2 <= r ^ 2. Проблема, как обычно, не в движках, а в головах
Более подробно объяснить эту математику, или где есть пример где используются координаты яндекс карт.
А совсем смешно становится когда пытаются найти прогамииста на различные специфичные фрайимворки js типа Node AngularJS.
А чего тут смешного??? Я кодил на php систему документооборта для одной Московской компании, теперь пишу на ноде, 95% бэкэнд, кстати js в этом плане больше понравился. Ставишь express и хоть сайты пиши.
Да, индексами отбираем точки, которые попадают в квадрат x0 - r <= x <= x0 + r, y0 - r <= y <= y0 + r . Потом из них те, которые попадают в искомый круг (x0 - x) ^ 2 + (y0 - y) ^ 2 <= r ^ 2. Проблема, как обычно, не в движках, а в головах
в смысле - не надо проверять всю базу... а координаты домов... объектов
так то - что косинус в квадрате плюс синус в квадрате равно одному или что икс в квадрате плюс игрик в квадрате равно радиус в квадрате
и если там упорядочено по координатам в базе
или откуда
что сразу отсечь квадрат
а потом из этого квадрата... условие - чтоб икс в квадрате плюс игрик в квадрате не было больше 200?
а там... что за чудо запрос в суперпроизводительную базу данных?
понять это могут максимум пять человек в чувашии.
супер программисты на пыхе. я - никакой не программист. но тоже вот так читаешь - интересно о чём так разговоры такие у программистов на пичпи.
как там лурке, который заблокировали и разболкировали, шутят про "программистов на пыхе". вспоминается. просто - интересно так - "программисты моего уровня на пыхе" и не где-нибудь, а в чебоксарах. всего 5 человек. крайне элитарный закрытый клуб.
но человек всё же решает какие-то свои практические задачи. интересно даже. но при этом живёт в каком-то своём мире с "программистами на пыхе моего уровня в чебоксарах"
Можно вот самый тяжелый запрос у меня, он выводит соседние дома в радиусе 200 метров
SELECT * FROM ' . MATERIALS_TABLE . ' WHERE `uid` != "' . $f_materials['uid'] . '" AND `approve` = "1" AND `status` = "1" AND `type` = 10 AND `city` = "' . $f_materials['city'] . '" AND ( 6371000 * acos ( cos ( radians ( ' . $coordinates[1] . ' ) ) * cos ( radians ( SUBSTRING_INDEX ( coordinates,",",-1 ) ) ) * cos ( radians ( SUBSTRING_INDEX ( coordinates,",",1 ) ) - radians ( ' . $coordinates[0] . ' ) ) + sin ( radians ( ' . $coordinates[1] . ' ) ) * sin ( radians ( SUBSTRING_INDEX ( coordinates,",",-1 ) ) ) ) ) <= 200 ORDER BY street ASC, ABS (`name`) ASC LIMIT 100';
Суть в том, что когда домов всего несколько тысяч все быстро считает 0.1-0.2 сек, но если у вас домов как у меня 650 тысяч, то это создает реальные проблемы запрос выполняется 3-4 секунды и даже индексы не спасают.
Сейчас у меня на данный все результаты расчетов выводов закешированы в файлы, проще говоря я их занного не считываю, только если когда обновляю данные
да? какая разница? сколько там домов?
если...
зачем всю базу проверять?
есть ограниченный квадрат
и в нём уже... проверять условие, чтоб за радиус круга не выходило
всю базу зачем?
если там уже координаты объектов... ну упорядочены как-то
и в нём уже... проверять условие, чтоб за радиус круга не выходило
всю базу зачем?
если там уже координаты объектов... ну упорядочены как-то
или - что это?
Вы не внимательно посмотрели, что ли во первых в запросе есть уточнение города в котором, нужно искать, а у нас городе всего 2 или 3 тысячи домов точно не помню, т.е поиск уже сужается, во во втрорых
пусть, что нибудь посмотрит те запросы которые там написаны, и плюнет мне в рожу со словами у меня быдло код, да там почти тоже самое, вычиления делает MYSQL я конечно сделаю, по квадрату поиск, только мне это походу ни чего не даст, потому что у них там тормозит.
Это их код
Исходный код
SELECT destination.*,3956 * 2 * ASIN(SQRT( POWER(SIN((orig.lat -dest.lat) * pi()/180 / 2), 2) +COS(orig.lat * pi()/180) * COS(dest.lat * pi()/180) *POWER(SIN((orig.lon -dest.lon) * pi()/180 / 2), 2) )) asdistance FROM users destination, users originWHERE origin.id=userid and destination.longitude between lon1 and lon2 and destination.latitude between lat1 and lat2 having distance < dist ORDER BY Distance limit 10;
А это время выполнения.
0.06 to 1.2 seconds (depending uponthe number of POIs/records in thegiven radius)
Сообщение отредактировал relibly - Nov 23 2015, 17:26