Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Долго выполняется запрос что можно предпринять [2]

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (3): « 1 [2] 3 »   

> Без описания
Мелкий Супермодератор
Отправлено: 22 Марта, 2016 - 10:18:03
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




3d_killer пишет:
die();
file_put_contents("PDOErrors.txt",

Мда, такого логирования мне ещё видеть не доводилось.

3d_killer пишет:
self::$DBH->query("SET NAMES 'utf8'");

Некорректно. Указывайте charset в строке подключения.

Затем переведите PDO::ATTR_ERRMODE в PDO::ERRMODE_EXCEPTION.
После этого увидите поочерёдно огромный ворох проблем из-за того, что вы привыкли пользоваться спецификой синтаксиса mysql.
А потом ещё несколько глупостей непосредственно в запросах, которые mysql (по-умолчанию или вовсе по жизни) разрешает делать, а postgresql - нет.


Может всё-таки отформатируете запрос до состояния, которое может прочитать человек, не вывернув голову? Невозможно воспринимать.
Лучше бы утянуть дополнительные данные вторым лёгким и быстрым запросом. И только если невозможно, что раскуривать этот. Например, зачем тут вообще группировка.


-----
PostgreSQL DBA
 
 Top
3d_killer
Отправлено: 22 Марта, 2016 - 10:41:47
Post Id



Участник


Покинул форум
Сообщений всего: 1916
Дата рег-ции: Апр. 2011  
Откуда: Ростов-на-Дону


Помог: 21 раз(а)




попробовал таблицу куда нацелены все JOIN поставить Memory, база прям залетала, интересно возможен такой механизм данные при записи пишутся в 2 таблицы эту и такуюже с типом например InnoDB, при старте сервака данные переносятся в таблицу Memory, и с ними работают, так как операций чтения очень много, а таблица сама по себе состоит из нескольких полей INT
(Добавление)
Мелкий мне нужно получить соответствие 1 объект - одна строка данных, конечно при записи в бд проверяется чтобы одному объекту соответствовало 1 значение какого либо свойства, но мало ли
(Добавление)
CODE (SQL):
скопировать код в буфер обмена
  1. попробовал запросом:
  2. REPLACE INTO `rs-cms_adresat_directory_values_to_object_mem`
  3. SELECT *
  4. FROM `rs-cms_adresat_directory_values_to_object`


/* Affected rows: 22272 Найденные строки: 0 Предупреждения: 0 Длительность 1 query: 0,000 sec. */
данных конечно сейчас мало но ожидается порядка 2-3 млн записей
что скажете? данную операцию надо будет производить только при старте сервака
(Добавление)
или тригером после инсерта?
(Добавление)
только вот никогда не писал их, так ругается
PHP:
скопировать код в буфер обмена
  1. BEGIN
  2. "REPLACE INTO `rs-cms_adresat_directory_values_to_object_mem` SELECT * FROM `rs-cms_adresat_directory_values_to_object`"

(Добавление)
сделал, данные при апдейте подтягиваются и меняются в основной таблице.
при апдейте и инсерте Memory обновляется она используется при подборе, если таблица пуста то подбор не работает, но мы видим список объектов без свойств, если зайти в объект то свойства подгружаются из основной таблицы, то есть потеря или изменение данных не там в принципе не возможна.

(Отредактировано автором: 22 Марта, 2016 - 10:57:30)

 
My status
 Top
3d_killer
Отправлено: 22 Марта, 2016 - 12:20:01
Post Id



Участник


Покинул форум
Сообщений всего: 1916
Дата рег-ции: Апр. 2011  
Откуда: Ростов-на-Дону


Помог: 21 раз(а)




вроде полегчало
Прикреплено изображение (Нажмите для увеличения)
D.jpg
 
My status
 Top
3d_killer
Отправлено: 23 Марта, 2016 - 09:01:32
Post Id



Участник


Покинул форум
Сообщений всего: 1916
Дата рег-ции: Апр. 2011  
Откуда: Ростов-на-Дону


Помог: 21 раз(а)




да нормально копируется
/* Affected rows: 400 049 Найденные строки: 0 Предупреждения: 0 Длительность 1 query: 0,562 sec. */
(Добавление)
/* Affected rows: 900 051 Найденные строки: 0 Предупреждения: 0 Длительность 1 query: 1,124 sec. */
 
My status
 Top
3d_killer
Отправлено: 26 Марта, 2016 - 10:25:23
Post Id



Участник


Покинул форум
Сообщений всего: 1916
Дата рег-ции: Апр. 2011  
Откуда: Ростов-на-Дону


Помог: 21 раз(а)




Мелкий поставил
self::$DBH->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
как все работало так и работает, ошибок не сыпет
Мелкий пишет:
3d_killer пишет:
self::$DBH->query("SET NAMES 'utf8'");

Некорректно. Указывайте charset в строке подключения.

так написано в документации PDO, то что вы говорите нигде не видел
(Добавление)
отформатированный запрос
CODE (SQL):
скопировать код в буфер обмена
  1.  
  2. SELECT
  3. `rs-cms_adresat_object`.*,
  4. `param_price`.value_int AS param_price ,
  5. `dir_param_rooms`.value_int AS param_rooms ,
  6. `dir_param_locality`.value AS param_locality ,
  7. `param_param_street`.value AS param_param_street ,
  8. `dir_param_floor`.value_int AS param_floor ,
  9. `dir_param_floors`.value_int AS param_floors ,
  10. `dir_param_status`.value AS param_status ,
  11. `dir_param_info`.value AS param_info ,
  12. `param_param_sole_owner`.value AS param_param_sole_owner ,
  13. `param_tel_sole_owner`.value AS param_tel_sole_owner ,
  14. `param_pl_obsh`.value_int AS param_pl_obsh ,
  15. `param_pl_jilaya`.value_int AS param_pl_jilaya ,
  16. `param_pl_kuhni`.value_int AS param_pl_kuhni ,
  17. `dir_param_ul_new`.value AS param_ul_new ,
  18. `rs-cms_core_users`.name AS user_name,
  19. `rs-cms_core_users`.email AS user_email,
  20. `rs-cms_core_users`.id AS user_id
  21.  
  22. FROM `rs-cms_adresat_object`
  23.  
  24. LEFT JOIN `rs-cms_adresat_directory_values_to_object` AS param_price ON
  25.         `param_price`.object_id = `rs-cms_adresat_object`.id AND `param_price`.id_directory=5
  26. LEFT JOIN `rs-cms_adresat_directory_values_to_object` AS `param_rooms` ON
  27.         `param_rooms`.object_id = `rs-cms_adresat_object`.id AND `param_rooms`.id_directory=6
  28. LEFT JOIN `rs-cms_adresat_directory_values` AS `dir_param_rooms` ON
  29.         `dir_param_rooms`.id = `param_rooms`.link AND `dir_param_rooms`.id_directory=6
  30. LEFT JOIN `rs-cms_adresat_directory_values_to_object` AS `param_locality` ON
  31.         `param_locality`.object_id = `rs-cms_adresat_object`.id AND `param_locality`.id_directory=2
  32. LEFT JOIN `rs-cms_adresat_directory_values` AS `dir_param_locality` ON
  33.         `dir_param_locality`.id = `param_locality`.link AND `dir_param_locality`.id_directory=2
  34. LEFT JOIN `rs-cms_adresat_directory_values_to_object` AS param_param_street ON
  35.         `param_param_street`.object_id = `rs-cms_adresat_object`.id AND `param_param_street`.id_directory=16
  36. LEFT JOIN `rs-cms_adresat_directory_values_to_object` AS `param_floor` ON
  37.         `param_floor`.object_id = `rs-cms_adresat_object`.id AND `param_floor`.id_directory=17
  38. LEFT JOIN `rs-cms_adresat_directory_values` AS `dir_param_floor` ON
  39.         `dir_param_floor`.id = `param_floor`.link AND `dir_param_floor`.id_directory=17
  40. LEFT JOIN `rs-cms_adresat_directory_values_to_object` AS `param_floors` ON
  41.         `param_floors`.object_id = `rs-cms_adresat_object`.id AND `param_floors`.id_directory=18
  42. LEFT JOIN `rs-cms_adresat_directory_values` AS `dir_param_floors` ON
  43.         `dir_param_floors`.id = `param_floors`.link AND `dir_param_floors`.id_directory=18
  44. LEFT JOIN `rs-cms_adresat_directory_values_to_object` AS `param_status` ON
  45.         `param_status`.object_id = `rs-cms_adresat_object`.id AND `param_status`.id_directory=11
  46. LEFT JOIN `rs-cms_adresat_directory_values` AS `dir_param_status` ON
  47.         `dir_param_status`.id = `param_status`.link AND `dir_param_status`.id_directory=11
  48. LEFT JOIN `rs-cms_adresat_directory_values_to_object` AS `param_info` ON
  49.         `param_info`.object_id = `rs-cms_adresat_object`.id AND `param_info`.id_directory=4
  50. LEFT JOIN `rs-cms_adresat_directory_values` AS `dir_param_info` ON
  51.         `dir_param_info`.id = `param_info`.link AND `dir_param_info`.id_directory=4
  52. LEFT JOIN `rs-cms_adresat_directory_values_to_object` AS param_param_sole_owner ON
  53.         `param_param_sole_owner`.object_id = `rs-cms_adresat_object`.id AND `param_param_sole_owner`.id_directory=19
  54. LEFT JOIN `rs-cms_adresat_directory_values_to_object` AS param_tel_sole_owner ON
  55.         `param_tel_sole_owner`.object_id = `rs-cms_adresat_object`.id AND `param_tel_sole_owner`.id_directory=15
  56. LEFT JOIN `rs-cms_adresat_directory_values_to_object` AS param_pl_obsh ON
  57.         `param_pl_obsh`.object_id = `rs-cms_adresat_object`.id AND `param_pl_obsh`.id_directory=8
  58. LEFT JOIN `rs-cms_adresat_directory_values_to_object` AS param_pl_jilaya ON
  59.         `param_pl_jilaya`.object_id = `rs-cms_adresat_object`.id AND `param_pl_jilaya`.id_directory=9
  60. LEFT JOIN `rs-cms_adresat_directory_values_to_object` AS param_pl_kuhni ON
  61.         `param_pl_kuhni`.object_id = `rs-cms_adresat_object`.id AND `param_pl_kuhni`.id_directory=10
  62. LEFT JOIN `rs-cms_adresat_directory_values_to_object` AS `param_ul_new` ON
  63.         `param_ul_new`.object_id = `rs-cms_adresat_object`.id AND `param_ul_new`.id_directory=21
  64. LEFT JOIN `rs-cms_adresat_directory_values` AS `dir_param_ul_new` ON
  65.         `dir_param_ul_new`.id = `param_ul_new`.link AND `dir_param_ul_new`.id_directory=21
  66. LEFT JOIN `rs-cms_adresat_object_owner` ON
  67.         `rs-cms_adresat_object_owner`.object_id = `rs-cms_adresat_object`.id
  68. LEFT JOIN `rs-cms_core_users` ON
  69.         `rs-cms_core_users`.id=`rs-cms_adresat_object_owner`.user_id
  70.  
  71.  
  72. WHERE `rs-cms_adresat_object`.type_id=:type AND
  73. `param_price`.value_int >= 1 AND
  74. `param_price`.value_int <= 54 AND
  75. `dir_param_rooms`.id =19 AND
  76. `dir_param_locality`.id ='3' AND
  77. `param_param_street`.value LIKE '%test%' AND
  78. `dir_param_floor`.id =25 AND
  79. `dir_param_floors`.id =50 AND
  80. `param_pl_obsh`.value_int >= 2 AND
  81. `param_pl_obsh`.value_int <= 6 AND
  82. `param_pl_jilaya`.value_int >= 1 AND
  83. `param_pl_jilaya`.value_int <= 6 AND
  84. `param_pl_kuhni`.value_int >= 4 AND
  85. `param_pl_kuhni`.value_int <= 54 AND
  86. `dir_param_ul_new`.id ='2427'
  87.  
  88. GROUP BY `rs-cms_adresat_object`.id
  89.  
  90. ORDER BY `rs-cms_adresat_object`.date_add DESC
  91.  
  92. LIMIT 0,50
  93.  

(Отредактировано автором: 26 Марта, 2016 - 10:39:11)

 
My status
 Top
LIME
Отправлено: 26 Марта, 2016 - 10:36:46
Post Id


Активный участник


Покинул форум
Сообщений всего: 10732
Дата рег-ции: Нояб. 2010  


Помог: 322 раз(а)




3d_killer ОМГ
не читал топик но явно ошибки в архитектуре
ну не может быть все так сложно
не?
(Добавление)
3d_killer пишет:
то что вы говорите нигде не видел
гонишь
3d_killer пишет:
"SET NAMES 'utf8'"
не есть хорошо
и Мелкий фигню не говорит
пруф искать не буду но это известный факт
Мелкий пишет:
Указывайте charset в строке подключения.
однозначно
может если еще один грамотей подтвердит ты начнешь внимательнее искать?
 
 Top
3d_killer
Отправлено: 26 Марта, 2016 - 10:40:38
Post Id



Участник


Покинул форум
Сообщений всего: 1916
Дата рег-ции: Апр. 2011  
Откуда: Ростов-на-Дону


Помог: 21 раз(а)




щас чуть нарисую
 
My status
 Top
LIME
Отправлено: 26 Марта, 2016 - 10:42:06
Post Id


Активный участник


Покинул форум
Сообщений всего: 10732
Дата рег-ции: Нояб. 2010  


Помог: 322 раз(а)




3d_killer да мне пофиг
я чисто про
3d_killer пишет:
то что вы говорите нигде не видел
гонишь
еще раз поищи
однозначно дельный совет от мелкого
 
 Top
3d_killer
Отправлено: 26 Марта, 2016 - 10:46:19
Post Id



Участник


Покинул форум
Сообщений всего: 1916
Дата рег-ции: Апр. 2011  
Откуда: Ростов-на-Дону


Помог: 21 раз(а)




Верю что дельный, но не находил, специально после того как он написал, я искал
(Добавление)
а про архитектуру, с таким ТЗ, не может быть все просто, хотим и добавлять типы объектов (хоть место в канализации) и свойства любые и в любом количестве, и фильтровать по любым свойствам
(Добавление)
LIME хотя может проблема конечно в том что я добавлял скриптом всякую хрень, не связанные данные
(Добавление)
LIME это?
PHP:
скопировать код в буфер обмена
  1. $options = array( PDO:: MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8');

Прикреплено изображение (Нажмите для увеличения)
123123.jpg
 
My status
 Top
LIME
Отправлено: 26 Марта, 2016 - 10:54:38
Post Id


Активный участник


Покинул форум
Сообщений всего: 10732
Дата рег-ции: Нояб. 2010  


Помог: 322 раз(а)




3d_killer пишет:
хотим и добавлять типы объектов
гуглить EAV
все уже решено
таблица связей
в ORM называется "pivot"
(Добавление)
3d_killer пишет:
специально после того как он написал, я искал
хреново искал
(Добавление)
3d_killer пишет:
LIME это?
я бы вспомнил
но с сожалению последние полгода работаю в ноде
уже не вспомню как там в PDO
 
 Top
3d_killer
Отправлено: 26 Марта, 2016 - 10:56:43
Post Id



Участник


Покинул форум
Сообщений всего: 1916
Дата рег-ции: Апр. 2011  
Откуда: Ростов-на-Дону


Помог: 21 раз(а)




PHP:
скопировать код в буфер обмена
  1. $options = array( PDO:: MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8');
  2. self::$DBH=new PDO(sprintf("mysql:host=%s;dbname=%s", $host, $db), $user, $pass,$options);
  3. self::$DBH->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
 
My status
 Top
LIME
Отправлено: 26 Марта, 2016 - 10:58:55
Post Id


Активный участник


Покинул форум
Сообщений всего: 10732
Дата рег-ции: Нояб. 2010  


Помог: 322 раз(а)




3d_killer пишет:
PDO:: MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8'
фуфуфу
плохо
только charset
(Добавление)
3d_killer пишет:
sprintf("mysql:host=%s;dbname=%s", $host, $db), $user, $pass,$options);
серьезно?
не думал вынести данные в отдельный конфиг?
чтоб отдельно работать с локальным субд
отдельно с сервером разработки
отдельно с сервером сборки
короче фу
разделяй и властвуй
 
 Top
3d_killer
Отправлено: 26 Марта, 2016 - 11:03:09
Post Id



Участник


Покинул форум
Сообщений всего: 1916
Дата рег-ции: Апр. 2011  
Откуда: Ростов-на-Дону


Помог: 21 раз(а)




PHP:
скопировать код в буфер обмена
  1. self::$DBH=new PDO(sprintf("mysql:host=%s;dbname=%s", $host, $db,"charset=utf8"), $user, $pass);
 
My status
 Top
LIME
Отправлено: 26 Марта, 2016 - 11:03:34
Post Id


Активный участник


Покинул форум
Сообщений всего: 10732
Дата рег-ции: Нояб. 2010  


Помог: 322 раз(а)




хотя я же не видел откуда берутся переменные))
просто сразу негатив на sprintf))
почему не конкатенация?
sprintf нужен когда не знаешь что прилетит
но это лирика
пофиг
(Добавление)
[quote=3d_killer][/quote] возможно
повторяю я забыл уже как там оно в пыхе
в ноде все лучше хотя бы потому что она не умирает
и смысл подготовленных запросов появляется
и вообще все иначе делается
наверное да
наверное так как ты показал

(Отредактировано автором: 26 Марта, 2016 - 11:07:07)

 
 Top
3d_killer
Отправлено: 26 Марта, 2016 - 11:08:11
Post Id



Участник


Покинул форум
Сообщений всего: 1916
Дата рег-ции: Апр. 2011  
Откуда: Ростов-на-Дону


Помог: 21 раз(а)




что "фу", понятно, ну пока на что горазд.... платят же за это, я не обучался на курсах и не занимался вплотную программированием, до того как сократили, теперь пока достойной работы нет по моей специальности приходится крутиться, извини уж что пришлось потратить на меня время

(Отредактировано автором: 26 Марта, 2016 - 11:10:19)

 
My status
 Top
Страниц (3): « 1 [2] 3 »
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« SQL и Архитектура БД »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB