Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Как сделать оптимизацию запроса? / 13 сообщений из 13, страница 1 из 1
03.10.2014, 16:10:22
    #38766312
tegs89
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сделать оптимизацию запроса?
Привет всем!
Есть следующий запрос к БД который делает выборку заказов магазина:

Код: php
1.
2.
3.
4.
5.
6.
7.
8.
$sql_ord="SELECT DISTINCT orders.id, orders.user_id,orders.area,orders.address, orders.user_name, orders.email, orders.phone, orders.address,DATE_FORMAT(orders.time_order, '%d:%m:%Y %H:%i') AS time_order , orders.delivery_id, orders.payment_id, orders.payment_id,orders.user_preffered_date,orders.user_preffered_time,orders.user_name,orders.delivery_id,orders.payment_id,orders.total_cost
                                        FROM orders, rule_group, rul_areas
                                        WHERE rule_group.id_units='$otde'
                                        AND rule_group.id_group=orders.us_g
                                        AND rul_areas.id_agency='$agen'
                                        AND rul_areas.id_area=orders.area ".$filter."
                                        OR orders.user_id ='0' ".$filter."
					AND orders.us_g='0' ".$filter." 



Запрос выполняется очень медленно - около 40 секунд. Методом тыка определил что это изза 2 последних строчек(это заказы незарегистрированых пользователей):

Код: php
1.
2.
 OR orders.user_id ='0' ".$filter."
AND orders.us_g='0' ".$filter



Как оптимизировать, ускорить время обработки?
...
Рейтинг: 0 / 0
03.10.2014, 16:30:18
    #38766335
javajdbc
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сделать оптимизацию запроса?
tegs89,


1. по любому почитайте и используйте EXPLAIN
для таких разборок

2. когда идет смесь AND OR -- полезно использовать
скобки для ясности.

3. Часто (не всегда) запросы с OR лучше переписывать
на два отдельных запроса и потом делать UNION ALL.
...
Рейтинг: 0 / 0
03.10.2014, 16:36:59
    #38766349
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сделать оптимизацию запроса?
tegs89
Код: php
1.
".$filter."

Это что за таинственный фильтр?
Выведите содержимое переменной $sql_ord непосредственно перед выполнением запроса и покажите нам.
...
Рейтинг: 0 / 0
03.10.2014, 17:47:16
    #38766512
tegs89
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сделать оптимизацию запроса?
javajdbctegs89,


1. по любому почитайте и используйте EXPLAIN
для таких разборок

2. когда идет смесь AND OR -- полезно использовать
скобки для ясности.

3. Часто (не всегда) запросы с OR лучше переписывать
на два отдельных запроса и потом делать UNION ALL.

Спасибо. Не подскажите хороший сайт с документацией?


javajdbcЭто что за таинственный фильтр?
Выведите содержимое переменной $sql_ord непосредственно перед выполнением запроса и покажите нам.

$filter - переменная добавления поиска для фильтра(если исп.фильтр):

Код: php
1.
2.
3.
4.
5.
    if (isset($_GET['id_order']) && $_GET['id_order']!=''){// вибір за кодом товару
		$filter= " AND orders.id LIKE '%".$_GET['id_order']."%'";
        $name_filter='поиск по номеру заказа "'.$_GET['id_order'].'"';
        
	}



Что вы имеете ввиду вывести $sql_ord перед выполнением? Не совсем понял.
...
Рейтинг: 0 / 0
03.10.2014, 17:49:39
    #38766514
tegs89
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сделать оптимизацию запроса?
Кстати пробовал ALTER TABLE order ADD INDEX(user_id, us_g).
Лучше не стало. Интересно, почему?
...
Рейтинг: 0 / 0
03.10.2014, 17:52:01
    #38766516
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сделать оптимизацию запроса?
tegs89Не подскажите хороший сайт с документацией?Лучше оригинальной документации еще ничего не придумали.
...
Рейтинг: 0 / 0
03.10.2014, 17:53:23
    #38766518
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сделать оптимизацию запроса?
tegs89Что вы имеете ввиду вывести $sql_ord перед выполнением? Не совсем понял.Именно это и имею в виду. Вывести содержимое переменной $sql_ord куда угодно - на страницу, в файл и т.п. А потом скопировать сюда.
...
Рейтинг: 0 / 0
03.10.2014, 17:54:25
    #38766519
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сделать оптимизацию запроса?
tegs89$filter - переменная добавления поиска для фильтра(если исп.фильтр):А зачем его три раза в запрос совать?
...
Рейтинг: 0 / 0
03.10.2014, 18:05:55
    #38766529
tegs89
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сделать оптимизацию запроса?
miksofttegs89Что вы имеете ввиду вывести $sql_ord перед выполнением? Не совсем понял.Именно это и имею в виду. Вывести содержимое переменной $sql_ord куда угодно - на страницу, в файл и т.п. А потом скопировать сюда.

Вы имеет ввиду через var_dump() скопировать что оно выводит?

[quot miksoft]tegs89А зачем его три раза в запрос совать?


Вы правы, хватило бы и 2. Но смысл оно смысл не меняет, пробовал. Из за посдених 2 строк
Код: php
1.
2.
 OR orders.user_id ='0' ".$filter."
AND orders.us_g='0' ".$filter

грузит около 40 секунд
...
Рейтинг: 0 / 0
03.10.2014, 18:09:21
    #38766533
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сделать оптимизацию запроса?
tegs89Вы имеет ввиду через var_dump() скопировать что оно выводит?Ну можно и так. Но, наверное, хватило бы и простого echo.
tegs89Вы правы, хватило бы и 2.А почему 2?
Хватило бы и одного.
...
Рейтинг: 0 / 0
03.10.2014, 18:46:03
    #38766569
tegs89
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сделать оптимизацию запроса?
var_dump($sql_ord) :

string(849) "SELECT DISTINCT orders.id, orders.user_id,orders.area,orders.address, orders.user_name, orders.email, orders.phone, orders.address,DATE_FORMAT(orders.time_order, '%d:%m:%Y %H:%i') AS time_order , orders.delivery_id, orders.payment_id, orders.payment_id,orders.user_preffered_date,orders.user_preffered_time,orders.user_name,orders.delivery_id,orders.payment_id,orders.total_cost FROM orders, rule_group, rul_areas WHERE rule_group.id_units='4' AND rule_group.id_group=orders.us_g AND rul_areas.id_agency='3' AND rul_areas.id_area=orders.area OR orders.user_id ='0' AND orders.us_g='0' "
...
Рейтинг: 0 / 0
03.10.2014, 18:57:45
    #38766582
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сделать оптимизацию запроса?
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
SELECT DISTINCT
  orders.id,
  orders.user_id,
  orders.area,
  orders.address,
  orders.user_name,
  orders.email,
  orders.phone,
  orders.address,
  DATE_FORMAT(orders.time_order, '%d:%m:%Y %H:%i') AS time_order,
  orders.delivery_id,
  orders.payment_id,
  orders.payment_id,
  orders.user_preffered_date,
  orders.user_preffered_time,
  orders.user_name,
  orders.delivery_id,
  orders.payment_id,
  orders.total_cost
FROM orders, rule_group, rul_areas
WHERE (rule_group.id_units='4'
  AND rule_group.id_group=orders.us_g
  AND rul_areas.id_agency='3'
  AND rul_areas.id_area=orders.area)
  OR (orders.user_id ='0'
  AND orders.us_g='0')

Оформил в тэг, отформатировал и расставил скобки. Теперь можно хоть что-то увидеть.
...
Рейтинг: 0 / 0
03.10.2014, 18:58:50
    #38766585
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сделать оптимизацию запроса?
tegs89,

А теперь проверьте, соответствуют ли скобки вашему пониманию того, что делает запрос.
...
Рейтинг: 0 / 0
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Как сделать оптимизацию запроса? / 13 сообщений из 13, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]