БД MySQL это не проблема языка. Сам PHP — в принципе, в архитектуре — имеет ряд ключевых недостатков.
Цитата(relibly @ Nov 5 2015, 22:35)
у меня сечас на сайте узкое место это база mysql вот сечас думаю, толи базу повесить на RAID0 из 4 дисков по 1 TB то ли купить 2 SSD по 240 GB.
Диски у меня есть, но материнка всего 4 порта sata поддерживает и на ней установлено и DDR3L 16GB, могу все это перенести все на дргую материнку где 6 портов sata, но придется памяти купить DDR3 16 GB обычной, потомуч что DDR3L не поддерживает, засада в общем)).
Redis, MemCached?
Ну с таким-то железом даже битрикс тормозить не будет особо ))))
Сообщение отредактировал MPA3b - Nov 5 2015, 22:44
Можно вот самый тяжелый запрос у меня, он выводит соседние дома в радиусе 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 секунды и даже индексы не спасают.
Сейчас у меня на данный все результаты расчетов выводов закешированы в файлы, проще говоря я их занного не считываю, только если когда обновляю данные
Сообщение отредактировал relibly - Nov 6 2015, 12:02
Суть в том, что когда домов всего несколько тысяч все быстро считает 0.1-0.2 сек, но если у вас домов как у меня 650 тысяч, то это создает реальные проблемы запрос выполняется 3-4 секунды и даже индексы не спасают.
Сейчас у меня на данный все результаты расчетов выводов закешированы в файлы, проще говоря я их занного не считываю, только если когда обновляю данные
на самом деле, этот пример - классический пример говнокода, вместо того, чтобы оптимизировать запрос, ограничить координаты максимальными и минимальными широтой и долготой окружности, ввести по этим колонкам индекс и довести выполнение запроса до нескольких десятков миллисекунд, он изобретает велосипед, хранит все вычисленные результаты в файлах и в памяти...
Сообщение отредактировал salex - Nov 7 2015, 21:56
на самом деле, этот пример - классический пример говнокода, вместо того, чтобы оптимизировать запрос, ограничить координаты максимальными и минимальными широтой и долготой окружности, ввести по этим колонкам индекс и довести выполнение запроса до нескольких десятков миллисекунд, он изобретает велосипед, хранит все вычисленные результаты в файлах и в памяти...
Да, индексами отбираем точки, которые попадают в квадрат x0 - r <= x <= x0 + r, y0 - r <= y <= y0 + r . Потом из них те, которые попадают в искомый круг (x0 - x) ^ 2 + (y0 - y) ^ 2 <= r ^ 2. Проблема, как обычно, не в движках, а в головах
--------------------
Developer -> Lead Developer -> Lead Architect -> ... ?
на самом деле, этот пример - классический пример говнокода, вместо того, чтобы оптимизировать запрос, ограничить координаты максимальными и минимальными широтой и долготой окружности, ввести по этим колонкам индекс и довести выполнение запроса до нескольких десятков миллисекунд, он изобретает велосипед, хранит все вычисленные результаты в файлах и в памяти...
Это Вы конечно здорого написали, пример приведите если конечно сможете, но я в этом сомневаюсь. Вы походу дело реально с большими данныи не работали. Велосипед я не изобретал, мне эти данные нужны только один раз при выводе информации о доме, поэтому и дергаю и кеша файла.
Да, индексами отбираем точки, которые попадают в квадрат x0 - r <= x <= x0 + r, y0 - r <= y <= y0 + r . Потом из них те, которые попадают в искомый круг (x0 - x) ^ 2 + (y0 - y) ^ 2 <= r ^ 2. Проблема, как обычно, не в движках, а в головах
Да достали своими индексами говорю не спасают. Можете переписать мой запрос по дуругому, а то советовать все горазды.
на самом деле, этот пример - классический пример говнокода, вместо того, чтобы оптимизировать запрос, ограничить координаты максимальными и минимальными широтой и долготой окружности, ввести по этим колонкам индекс и довести выполнение запроса до нескольких десятков миллисекунд, он изобретает велосипед, хранит все вычисленные результаты в файлах и в памяти...
Вот типый сайт было кода, тормозит бросто без божно http://ww.stolplit.ru/, интересует ваше мнение? Движок битрикс форева, тут есть любители говно битрикса.
Сообщение отредактировал relibly - Nov 8 2015, 20:34
Это Вы конечно здорого написали, пример приведите если конечно сможете, но я в этом сомневаюсь.
у меня этот запрос, о великий программист php, работает срабатывает за 19мс, на 800 тыс объектах, при чем на железе, которое явно не дотягивает до серверного, да еще и на бд встраиваемой, первоначальный запрос работает за 9.416с
Исходный код
select * from coords WHERE b1 between @bmin and @bmax and a1 between @amin and @amax and 6371000*acos(sin(radians(b1))*sin(radians(@b0))+cos(radians(b1))*cos(radians(@b0))*cos(radians(a1)-radians(@a0))) <200;
Цитата(relibly @ Nov 8 2015, 20:29)
Да достали своими индексами говорю не спасают. Можете переписать мой запрос по дуругому, а то советовать все горазды.
индексы не спасают в случае со сложными тригонометрическими формулами, в твоем случае, эта сложная формула вычисляется для каждой строки, зато индексы работают с простыми условиями, как вам указали используйте ограничение по сектору, в который вписывается указанный круг, в результате, формула будет вычистятся максимум для 100-200 строк
Сообщение отредактировал salex - Nov 8 2015, 23:30
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';
Когда программисты просят меня оптимизировать похожие запросы, то, посмотрев на такое художество, я первым делом отправляю их читать букварь с места где пишут про переменные связывания. Хоть с мускулем я и не знаком, но думаю, что даже там есть парсинг и кэширование его результатов.