powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Оптимизация запроса
17 сообщений из 17, страница 1 из 1
Оптимизация запроса
    #38920780
necoro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Доброго времени суток форумчане, прошу помощи с оптимизацией вот такого запроса:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
SELECT SQL_CALC_FOUND_ROWS provider.name,provider.id,provider.code,IFNULL(GROUP_CONCAT(DISTINCT t.name),'Unset') as type_name,IFNULL(GROUP_CONCAT(DISTINCT sname.name),'Unset') as spec_name,
                provider.notes,provider.addr,provider.phone,provider.clas,provider.agr1_number, country_list.name as cur_country,user_cities.name as cur_cities,ap_cards,all_day,
                provider.priority,provider.agr1_discount
                FROM user_cards provider
                          left join user_cards_multy_type s ON provider.code = s.code
                          left join user_type t on s.type=t.id
                          left join user_cards_multy_spec spec on spec.prov_code = s.code
                          left join user_multi_specialty sname on sname.id=spec.spec,
                     user_countries as country_list,user_cities,user_type
                Where provider.country=country_list.id and provider.city=user_cities.id and 1  GROUP BY provider.code DESC limit 0,50



Суть запроса:
выбираются первые 50 провайдеров из базы user_cards имеющие неограниченное количество типов и специализаций ID которых для каждого провайдера, хранятся в таблицах user_cards_multy_type и user_cards_multy_spec. Сами названия типов и специализаций хранятся в таблицах user_type и user_multi_specialty.

Проблема: данный запрос выполняется более 10 секунд ((

explain запроса:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
+----+-------------+--------------+--------+---------------+-----------+---------+-------------------------+------+----------------------------------------------+
| id | select_type | table        | type   | possible_keys | key       | key_len | ref                     | rows | Extra                                        |
+----+-------------+--------------+--------+---------------+-----------+---------+-------------------------+------+----------------------------------------------+
|  1 | SIMPLE      | user_type    | index  | NULL          | PRIMARY   | 4       | NULL                    |    8 | Using index; Using temporary; Using filesort |
|  1 | SIMPLE      | provider     | ALL    | NULL          | NULL      | NULL    | NULL                    | 8212 | Using join buffer                            |
|  1 | SIMPLE      | s            | ref    | prov_code     | prov_code | 4       | assist.provider.code    |    1 |                                              |
|  1 | SIMPLE      | t            | eq_ref | PRIMARY,id    | PRIMARY   | 4       | assist.s.type           |    1 |                                              |
|  1 | SIMPLE      | spec         | ref    | prov_code     | prov_code | 4       | assist.s.code           |    1 |                                              |
|  1 | SIMPLE      | sname        | eq_ref | PRIMARY       | PRIMARY   | 4       | assist.spec.spec        |    1 |                                              |
|  1 | SIMPLE      | country_list | eq_ref | PRIMARY       | PRIMARY   | 4       | assist.provider.country |    1 |                                              |
|  1 | SIMPLE      | user_cities  | eq_ref | PRIMARY       | PRIMARY   | 4       | assist.provider.city    |    1 |                                              |
+----+-------------+--------------+--------+---------------+-----------+---------+-------------------------+------+----------------------------------------------+



Вывод show create table user_cards:
Код: 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.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
mysql> show create table user_cards;
| user_cards | CREATE TABLE `user_cards` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `view` int(1) DEFAULT NULL,
  `city_text` char(255) DEFAULT NULL,
  `chapter_id` int(11) NOT NULL DEFAULT '18',
  `view_count` int(11) NOT NULL DEFAULT '0',
  `user_id` int(11) NOT NULL DEFAULT '35',
  `allow` int(1) DEFAULT '0',
  `crt_user` int(3) NOT NULL,
  `date` date NOT NULL,
  `edit_date` date DEFAULT NULL,
  `code` int(6) NOT NULL,
  `name` char(255) DEFAULT NULL,
  `addr` char(255) DEFAULT NULL,
  `addr2` char(255) DEFAULT NULL,
  `city` int(11) NOT NULL,
  `country` int(11) NOT NULL,
  `lang` int(11) DEFAULT NULL,
  `lang2` int(11) DEFAULT NULL,
  `contact_person` varchar(50) DEFAULT NULL,
  `phone` char(255) DEFAULT NULL,
  `phone2` char(255) DEFAULT NULL,
  `email` char(255) DEFAULT NULL,
  `fax` char(255) DEFAULT NULL,
  `all_day` int(1) DEFAULT NULL,
  `notes` text,
  `comission` int(11) DEFAULT NULL,
  `clas` varchar(10) NOT NULL DEFAULT 'unset',
  `ap_cards` int(1) NOT NULL DEFAULT '0',
  `bank_detail_foreign` longtext,
  `bank_detail_russian` longtext,
  `lat` decimal(10,8) DEFAULT NULL,
  `lng` decimal(11,8) DEFAULT NULL,
  `error_count` int(3) NOT NULL DEFAULT '0',
  `priority` int(1) NOT NULL DEFAULT '1',
  `sector` int(1) DEFAULT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `code` (`code`),
  KEY `chapter_link` (`chapter_id`),
  KEY `user_link` (`user_id`),
  KEY `name` (`name`)
) ENGINE=MyISAM AUTO_INCREMENT=9344 DEFAULT CHARSET=utf8 |



Вывод:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
mysql> show create table user_cards_multy_spec;
mysql> show create table user_cards_multy_spec;
+-----------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table                 | Create Table                                                                                                                                                                                                            |
+-----------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| user_cards_multy_spec | CREATE TABLE `user_cards_multy_spec` (
  `prov_code` int(11) NOT NULL,
  `spec` int(2) NOT NULL,
  `value` int(1) NOT NULL,
  KEY `prov_code` (`prov_code`),
  KEY `spec` (`spec`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 |
+-----------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)



Вывод:show create table user_cards_multy_type;
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
mysql> show create table user_cards_multy_type;
+-----------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table                 | Create Table                                                                                                                                                                                                  |
+-----------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| user_cards_multy_type | CREATE TABLE `user_cards_multy_type` (
  `code` int(11) NOT NULL,
  `type` int(2) NOT NULL,
  `value` int(1) NOT NULL,
  KEY `prov_code` (`code`),
  KEY `type` (`type`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 |
+-----------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)



Вывод: show create table user_type;
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
mysql> show create table user_type;
+-----------+--------------------------------------------------------------------------------------------------------------------------------------------------+
| Table     | Create Table |
+-----------+--------------------------------------------------------------------------------------------------------------------------------------------------+
| user_type | CREATE TABLE `user_type` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `chapter_id` int(11) NOT NULL DEFAULT '21',
  `view_count` int(11) NOT NULL,
  `user_id` int(11) NOT NULL,
  `allow` int(1) NOT NULL,
  `name` char(255) DEFAULT NULL,
  `view` int(1) DEFAULT '1',
  `group` int(1) NOT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `id` (`id`),
  UNIQUE KEY `name` (`name`),
  KEY `chapter_link` (`chapter_id`),
  KEY `user_link` (`user_id`)
) ENGINE=MyISAM AUTO_INCREMENT=10 DEFAULT CHARSET=utf8 |
+-----------+--------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)



Ну и вывод:show create table user_multi_specialty;
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
mysql> show create table user_multi_specialty;
+----------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table                | Create Table                                                                                                                                                                                |
+----------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| user_multi_specialty | CREATE TABLE `user_multi_specialty` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` char(255) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=108 DEFAULT CHARSET=utf8 |
+----------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)
...
Рейтинг: 0 / 0
Оптимизация запроса
    #38920796
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Что-то оптимизатор не догоняет... статистику обновить не пробовали? Если пробовали и не помогло, то предлагаю переписать запрос, заменив "provider" на непосредственно выбранные 50 записей из таблицы user_cards (т.е. на подзапрос).
ЗЫ. MyISAM? А зачем?
...
Рейтинг: 0 / 0
Оптимизация запроса
    #38920816
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
necoro,

Плохой стиль смешивать обычные JOIN-ы и перечисление таблиц через запятую в секции FROM, т.к. эти операции имеют разный приоритет и даже результат иногда может оказаться неожиданным.
Попробуйте запятые заменить на JOIN-ы или LEFT JOIN (в зависимости от логики таблиц), а вместо provider сделать подзапрос, как советует tanglir.
...
Рейтинг: 0 / 0
Оптимизация запроса
    #38920949
necoro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Запутался я ..
Сделал такой запрос
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
SELECT SQL_CALC_FOUND_ROWS provider.name,provider.id,provider.code,IFNULL(GROUP_CONCAT(DISTINCT t.name),'Unset') as type_name,IFNULL(GROUP_CONCAT(DISTINCT sname.name),'Unset') as spec_name,
                provider.notes,provider.addr,provider.phone,provider.clas,provider.agr1_number, country_list.name as cur_country,user_cities.name as cur_cities,ap_cards,all_day,
                provider.priority,provider.agr1_discount
                FROM (SELECT id,name,code,notes,addr,phone,clas,agr1_number,ap_cards,all_day,priority,agr1_discount,country,city from user_cards GROUP BY user_cards.code ORDER BY user_cards.code DESC limit 0,50
			) AS provider
                          left join user_cards_multy_type s ON provider.code = s.code
                          left join user_type t on s.type=t.id
                          left join user_cards_multy_spec spec on spec.prov_code = provider.code
                          left join user_multi_specialty sname on sname.id=spec.spec
                          left join user_countries country_list on provider.country=country_list.id
                          left join user_cities user_cities on provider.city=user_cities.id



Все бы хорошо, но теперь возвращается только 1 запись ..
Вот его explain
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
+----+-------------+--------------+--------+---------------+-----------+---------+------------------+------+-------+
| id | select_type | table        | type   | possible_keys | key       | key_len | ref              | rows | Extra |
+----+-------------+--------------+--------+---------------+-----------+---------+------------------+------+-------+
|  1 | PRIMARY     | <derived2>   | ALL    | NULL          | NULL      | NULL    | NULL             |   50 |       |
|  1 | PRIMARY     | s            | ref    | prov_code     | prov_code | 4       | provider.code    |    1 |       |
|  1 | PRIMARY     | t            | eq_ref | PRIMARY,id    | PRIMARY   | 4       | assist.s.type    |    1 |       |
|  1 | PRIMARY     | spec         | ref    | prov_code     | prov_code | 4       | provider.code    |    4 |       |
|  1 | PRIMARY     | sname        | eq_ref | PRIMARY       | PRIMARY   | 4       | assist.spec.spec |    1 |       |
|  1 | PRIMARY     | country_list | eq_ref | PRIMARY       | PRIMARY   | 4       | provider.country |    1 |       |
|  1 | PRIMARY     | user_cities  | eq_ref | PRIMARY       | PRIMARY   | 4       | provider.city    |    1 |       |
|  2 | DERIVED     | user_cards   | index  | NULL          | code      | 4       | NULL             |   50 |       |
+----+-------------+--------------+--------+---------------+-----------+---------+------------------+------+-------+
8 rows in set (0.00 sec)
...
Рейтинг: 0 / 0
Оптимизация запроса
    #38920954
retvizan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Для начала можно попробовать запрос без SQL_CALC_FOUND_ROWS, тем более что с выборкой 50 провайдеров в подзапросе его использование вообще теряет смысл.

Уверены ли в корректности выборки столбцов без агрегатных функций в вашем случае?
...
Рейтинг: 0 / 0
Оптимизация запроса
    #38920979
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
necoro,

Если я ничего не напутал, то примерно так:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
SELECT provider.name,provider.id,provider.code,IFNULL(t.name,'Unset') as type_name,IFNULL(sname.name,'Unset') as spec_name,
                provider.notes,provider.addr,provider.phone,provider.clas,provider.agr1_number, country_list.name as cur_country,user_cities.name as cur_cities,ap_cards,all_day,
                provider.priority,provider.agr1_discount
                FROM (SELECT id,name,code,notes,addr,phone,clas,agr1_number,ap_cards,all_day,priority,agr1_discount,country,city
                  from user_cards
                  ORDER BY user_cards.code DESC
                  limit 0,50
			) AS provider
                          left join user_cards_multy_type s ON provider.code = s.code
                          left join user_type t on s.type=t.id
                          left join user_cards_multy_spec spec on spec.prov_code = provider.code
                          left join user_multi_specialty sname on sname.id=spec.spec
                          left join user_countries country_list on provider.country=country_list.id
                          left join user_cities user_cities on provider.city=user_cities.id
...
Рейтинг: 0 / 0
Оптимизация запроса
    #38921008
necoro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
to miksoft.

Без GROUP MySQL дублирует каждую строку по количеству вхождений в user_cards_multy_type,user_multi_specialty.

Более/менее рабочий вариант получается таким:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
SELECT provider.name,provider.id,provider.code,IFNULL(GROUP_CONCAT(DISTINCT t.name),'Unset') as type_name,IFNULL(GROUP_CONCAT(DISTINCT sname.name),'Unset') as spec_name,
                provider.notes,provider.addr,provider.phone,provider.clas,provider.agr1_number, country_list.name as cur_country,user_cities.name as cur_cities,ap_cards,all_day,
                provider.priority,provider.agr1_discount
                FROM (SELECT id,name,code,notes,addr,phone,clas,agr1_number,ap_cards,all_day,priority,agr1_discount,country,city from user_cards  limit 0,50) AS provider
                          left join user_cards_multy_type s ON provider.code = s.code
                          left join user_type t on s.type=t.id
                          left join user_cards_multy_spec spec on spec.prov_code = s.code
                          left join user_multi_specialty sname on sname.id=spec.spec
                          left join user_countries country_list on provider.country=country_list.id
                          left join user_cities user_cities on provider.city=user_cities.id                          
               GROUP BY provider.code ORDER BY provider.code



Его explain:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
+----+-------------+--------------+--------+---------------+-----------+---------+------------------+------+----------------+
| id | select_type | table        | type   | possible_keys | key       | key_len | ref              | rows | Extra          |
+----+-------------+--------------+--------+---------------+-----------+---------+------------------+------+----------------+
|  1 | PRIMARY     | <derived2>   | ALL    | NULL          | NULL      | NULL    | NULL             |   50 | Using filesort |
|  1 | PRIMARY     | s            | ref    | prov_code     | prov_code | 4       | provider.code    |    1 |                |
|  1 | PRIMARY     | t            | eq_ref | PRIMARY,id    | PRIMARY   | 4       | assist.s.type    |    1 |                |
|  1 | PRIMARY     | spec         | ref    | prov_code     | prov_code | 4       | assist.s.code    |    4 |                |
|  1 | PRIMARY     | sname        | eq_ref | PRIMARY       | PRIMARY   | 4       | assist.spec.spec |    1 |                |
|  1 | PRIMARY     | country_list | eq_ref | PRIMARY       | PRIMARY   | 4       | provider.country |    1 |                |
|  1 | PRIMARY     | user_cities  | eq_ref | PRIMARY       | PRIMARY   | 4       | provider.city    |    1 |                |
|  2 | DERIVED     | user_cards   | ALL    | NULL          | NULL      | NULL    | NULL             | 8212 |                |
+----+-------------+--------------+--------+---------------+-----------+---------+------------------+------+----------------+
8 rows in set (0.01 sec)
...
Рейтинг: 0 / 0
Оптимизация запроса
    #38921016
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
necoro,

Нет, это явно не рабочий вариант.
Я упустил тот момент, что user_cards.code не является первичным ключом, как я думал.

И группировка, и агрегатные функции должны быть в подзапросе.
Но тут нужно определиться - из какой именно записи нужно брать значения для остальных полей таблицы user_cards в пределах группы по user_cards.code ?
...
Рейтинг: 0 / 0
Оптимизация запроса
    #38921019
retvizan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
necoro,

в подзапросе потеряли
ORDER BY user_cards.code DESC
...
Рейтинг: 0 / 0
Оптимизация запроса
    #38921024
retvizan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
miksoftnecoro,

Нет, это явно не рабочий вариант.
Я упустил тот момент, что user_cards.code не является первичным ключом, как я думал.

И группировка, и агрегатные функции должны быть в подзапросе.
Но тут нужно определиться - из какой именно записи нужно брать значения для остальных полей таблицы user_cards в пределах группы по user_cards.code ?

`code` int(6) NOT NULL,
UNIQUE KEY `code` (`code`),
так что в подзапросе группировка не нужна.
...
Рейтинг: 0 / 0
Оптимизация запроса
    #38921035
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
retvizan `code` int(6) NOT NULL,
UNIQUE KEY `code` (`code`),
так что в подзапросе группировка не нужна.Хм, действительно.
...
Рейтинг: 0 / 0
Оптимизация запроса
    #38921037
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
retvizannecoro,

в подзапросе потеряли
ORDER BY user_cards.code DESCА итоговый ORDER BY лишний.

С этими поправками вроде должно получиться.
...
Рейтинг: 0 / 0
Оптимизация запроса
    #38921049
necoro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Работает только в таком варианте:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
SELECT SQL_CALC_FOUND_ROWS provider.name,provider.id,provider.code,IFNULL(GROUP_CONCAT(DISTINCT t.name),'Unset') as type_name,IFNULL(GROUP_CONCAT(DISTINCT sname.name),'Unset') as spec_name,
                provider.notes,provider.addr,provider.phone,provider.clas,provider.agr1_number, country_list.name as cur_country,user_cities.name as cur_cities,ap_cards,all_day,
                provider.priority,provider.agr1_discount
                FROM (SELECT id,name,code,notes,addr,phone,clas,agr1_number,ap_cards,all_day,priority,agr1_discount,country,city from user_cards ORDER BY user_cards.code DESC) AS provider
                          left join user_cards_multy_type s ON provider.code = s.code
                          left join user_type t on s.type=t.id
                          left join user_cards_multy_spec spec on spec.prov_code = s.code
                          left join user_multi_specialty sname on sname.id=spec.spec
                          left join user_countries country_list on provider.country=country_list.id
                          left join user_cities user_cities on provider.city=user_cities.id
                GROUP BY provider.code



explain:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
+----+-------------+--------------+--------+---------------+-----------+---------+------------------+------+----------------+
| id | select_type | table        | type   | possible_keys | key       | key_len | ref              | rows | Extra          |
+----+-------------+--------------+--------+---------------+-----------+---------+------------------+------+----------------+
|  1 | PRIMARY     | <derived2>   | ALL    | NULL          | NULL      | NULL    | NULL             | 8212 | Using filesort |
|  1 | PRIMARY     | s            | ref    | prov_code     | prov_code | 4       | provider.code    |    1 |                |
|  1 | PRIMARY     | t            | eq_ref | PRIMARY,id    | PRIMARY   | 4       | assist.s.type    |    1 |                |
|  1 | PRIMARY     | spec         | ref    | prov_code     | prov_code | 4       | assist.s.code    |    4 |                |
|  1 | PRIMARY     | sname        | eq_ref | PRIMARY       | PRIMARY   | 4       | assist.spec.spec |    1 |                |
|  1 | PRIMARY     | country_list | eq_ref | PRIMARY       | PRIMARY   | 4       | provider.country |    1 |                |
|  1 | PRIMARY     | user_cities  | eq_ref | PRIMARY       | PRIMARY   | 4       | provider.city    |    1 |                |
|  2 | DERIVED     | user_cards   | ALL    | NULL          | NULL      | NULL    | NULL             | 8212 | Using filesort |
+----+-------------+--------------+--------+---------------+-----------+---------+------------------+------+----------------+
...
Рейтинг: 0 / 0
Оптимизация запроса
    #38921055
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
necoroРаботает только в таком варианте:Теперь LIMIT потерялся :)
...
Рейтинг: 0 / 0
Оптимизация запроса
    #38921066
retvizan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А SQL_CALC_FOUND_ROWS нашелся :)
...
Рейтинг: 0 / 0
Оптимизация запроса
    #38921117
necoro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
miksoft,

ОоО, я даже не заметил на глаз разницы в скорости обработки запроса что для 50-записей что для всей таблицы ))
Итоговый вариант
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
SELECT SQL_CALC_FOUND_ROWS provider.name,provider.id,provider.code,IFNULL(GROUP_CONCAT(DISTINCT t.name),'Unset') as type_name,IFNULL(GROUP_CONCAT(DISTINCT sname.name),'Unset') as spec_name,
                provider.notes,provider.addr,provider.phone,provider.clas,provider.agr1_number, country_list.name as cur_country,user_cities.name as cur_cities,ap_cards,all_day,
                provider.priority,provider.agr1_discount
                FROM (SELECT id,name,code,notes,addr,phone,clas,agr1_number,ap_cards,all_day,priority,agr1_discount,country,city from user_cards ORDER BY user_cards.code DESC limit 0,50) AS provider
                          left join user_cards_multy_type s ON provider.code = s.code
                          left join user_type t on s.type=t.id
                          left join user_cards_multy_spec spec on spec.prov_code = s.code
                          left join user_multi_specialty sname on sname.id=spec.spec
                          left join user_countries country_list on provider.country=country_list.id
                          left join user_cities user_cities on provider.city=user_cities.id
                GROUP BY provider.code


Просто летает, спасибо всем )

P.S. возник вопрос а как теперь добавлять строку с фильтрами хоть по странам/городам, хоть по специализациям .. ))
Первоначально на PHP все выглядело вот так:
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
    $sql = "provider.name,provider.id,provider.code,IFNULL(GROUP_CONCAT(DISTINCT t.name),'Unset') as type_name,IFNULL(GROUP_CONCAT(DISTINCT sname.name),'Unset') as spec_name, 
                provider.notes,provider.addr,provider.phone,provider.clas,provider.agr1_number, country_list.name as cur_country,user_cities.name as cur_cities,ap_cards,all_day,
                provider.priority,provider.agr1_discount 
                FROM user_cards provider 
                          left join user_cards_multy_type s ON provider.code = s.code 
                          left join user_type t on s.type=t.id 
                          left join user_cards_multy_spec spec on spec.prov_code = s.code 
                          left join user_multi_specialty sname on sname.id=spec.spec, 
                     user_countries as country_list,user_cities,user_type  
                Where provider.country=country_list.id and provider.city=user_cities.id and 1 $whereClause";
    $limit = 'GROUP BY provider.code ORDER BY provider.code DESC limit ' . $stroka . ',50';
    $result = $db->select('assist', 'SELECT SQL_CALC_FOUND_ROWS ' . $sql . ' ' . $limit);


До этого соответственно заполнялась строка $whereClause.
Если в новый запрос вставить в конце and 1 $whereClause то логично предположить выборка пойдет только из первых 50 строк... Тогда получается надо добавлять эту строку в подзапрос, он не поймет ничего про страны/города да и прочее не находящееся в user_cards .. ОМГ ))
...
Рейтинг: 0 / 0
Оптимизация запроса
    #38921129
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
necoroвозник вопрос а как теперь добавлять строку с фильтрами хоть по странам/городам, хоть по специализациям .. ))ЕМНИП кто-то с этого форума...А вообще, я очень хочу, чтобы наша профессия со временем стала такой же инженерной дисциплиной, как, например, строительство - вам нужно здание? Извольте заплатить за проект, а потом за возведение, или покупайте (арендуйте) готовое, но тут уж не выдвигайте требований пристроить к нему еще 30 этажей. Изволили построить времянку, а теперь хотите ее превратить в доменный цех? нет проблем - СНОСИМ временку и строим цех. Через пять лет вам потребуется переделать цех в аэропорт? Это ваши трудности - х*й в голове медицина бессильна. Вы никогда не задумывались почему в IT такой процент проваленных проектов (представьте себе такой процент например в автомобилестроениии)? А потому, что делают их не в рамках инженерного подхода, а вопреки ему.... И заметьте, никто не кричит "Судостроители пи...сы не хотят переделать речной трамвайчик в ледокол". Ээээх мечты...
Фильтры-то к чему применяются? Если к базовой таблице, так и перенесите их в подзапрос. А если нет, см.выше
...
Рейтинг: 0 / 0
17 сообщений из 17, страница 1 из 1
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Оптимизация запроса
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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