powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Помогите оптимизировать запрос. В одной из таблиц записей более 2 млн. Выполнение 30 сек.
23 сообщений из 23, страница 1 из 1
Помогите оптимизировать запрос. В одной из таблиц записей более 2 млн. Выполнение 30 сек.
    #38600900
dundin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день!
Приходится писать на форум ибо сам не могу понять куда копать.
Словесное описание запроса:
Показать все организации (gsorg), которые давали объявления в определенном городе (glcitymy), области (globlmy), и с которыми еще не было переписки (rmailorg).

Вот запрос:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
 SELECT DISTINCT gsorg.id id
 FROM gsorg
      INNER JOIN radvorg ON radvorg.orgId = gsorg.id
      INNER JOIN adverts ON adverts.id = radvorg.advertId
      INNER JOIN glcitymy ON glcitymy.id = adverts.cityId
      INNER JOIN globlmy ON globlmy.id = glcitymy.oblId
      LEFT JOIN rmailorg ON rmailorg.orgId = gsorg.id
 WHERE 1 = 1 AND
       globlmy.id IN (61) AND
       adverts.themeId IN (2) AND
       adverts.date > '2013.11.11' AND
       (rmailorg.orgId IS NULL OR
       rmailorg.send = 0)
LIMIT 0, 10       




На все нужные поля есть индексы.
В тестовой таблице gsorg более 2 млн. записей

Вот EXPLAIN:

id select_type table type possible_keys key key_len ref rows Extra1 SIMPLE globlmy const PRIMARY PRIMARY 4 const 1 Using index; Using temporary1 SIMPLE glcitymy ref PRIMARYoblId oblId 5 const 27 Using where; Using index1 SIMPLE adverts ref PRIMARYcityIdthemeId cityId 5 smser.glcitymy.id 4358 Using where1 SIMPLE radvorg ref orgIdorgId_2advertId advertId 5 smser.adverts.id 1 Using where1 SIMPLE gsorg eq_ref PRIMARY PRIMARY 4 smser.radvorg.orgId 1 Using index1 SIMPLE rmailorg ref orgIdorgId_2 orgId 5 smser.radvorg.orgId 1 Using where; Distinct

В плане explain не силен, поэтому пробовал всякие варианты с увеличением tmp_table_size. Сейчас стоит 256M - вообще никак не влияет.
Эксперименты показали что как только подключаешь таблицу связи - "Организации-Объявления" (radvorg) - сразу происходит значительно увеличение времени выполнения.

Куда копать? Может какие то системные переменные увеличить?


Вроде везде все по индексам.
...
Рейтинг: 0 / 0
Помогите оптимизировать запрос. В одной из таблиц записей более 2 млн. Выполнение 30 сек.
    #38600906
dundin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вот нормальный EXPLAIN (в пред. посте не получилось оформить в виде таблицы)
idselect_typetabletypepossible_keyskeykey_lenrefrowsExtra1SIMPLEgloblmyconstPRIMARYPRIMARY4const1Using index; Using temporary1SIMPLEglcitymyrefPRIMARY;oblIdoblId5const27Using where; Using index1SIMPLEadvertsrefPRIMARY;cityId;themeIdcityId5smser.glcitymy.id4358Using where1SIMPLEradvorgreforgId;orgId_2;advertIdadvertId5smser.adverts.id1Using where1SIMPLEgsorgeq_refPRIMARYPRIMARY4smser.radvorg.orgId1Using index1SIMPLErmailorgreforgId;orgId_2orgId5smser.radvorg.orgId1Using where; Distinct
...
Рейтинг: 0 / 0
Помогите оптимизировать запрос. В одной из таблиц записей более 2 млн. Выполнение 30 сек.
    #38600919
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dundin,

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
SELECT DISTINCT gsorg.id id
 FROM gsorg
      INNER JOIN radvorg ON radvorg.orgId = gsorg.id
      INNER JOIN adverts ON adverts.id = radvorg.advertId
      INNER JOIN glcitymy ON glcitymy.id = adverts.cityId
      INNER JOIN globlmy ON globlmy.id = glcitymy.oblId
      LEFT JOIN rmailorg ON rmailorg.orgId = gsorg.id
 WHERE 1 = 1 AND
       globlmy.id IN (61) AND
       adverts.themeId IN (2) AND
       adverts.date > '2013.11.11' AND
       (rmailorg.orgId IS NULL OR
       rmailorg.send = 0)
LIMIT 0, 10     




LIMIT без ORDER BY -- бессмысленен.
Перепиши сначала запрос правильно, затем будешь его уже оптимизировать.

Также нужны будут DDL-и всех таблиц с индексами.
...
Рейтинг: 0 / 0
Помогите оптимизировать запрос. В одной из таблиц записей более 2 млн. Выполнение 30 сек.
    #38600927
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dundin
Код: sql
1.
'2013.11.11'

В MySQL даты пишутся иначе.
См. Date and Time Literals
...
Рейтинг: 0 / 0
Помогите оптимизировать запрос. В одной из таблиц записей более 2 млн. Выполнение 30 сек.
    #38600956
dundin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
MasterZiv,
добавление ORDER BY id ASC погоды не сделало - все также долго.
Кроме того т.к. это делается для веб-интерфейса, то чтобы показать в виде таблицы с пагинатором - нужен второй запрос который будет считать COUNT - а тут уже ORDER BY бессмысленен.

DDL:
Организации: gsorg
Код: sql
1.
2.
3.
4.
5.
6.
CREATE TABLE `gsorg` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `org` varchar(20) NOT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `org` (`org`)
) ENGINE=InnoDB AUTO_INCREMENT=26950233 DEFAULT CHARSET=utf8;



Связь организаций и их объявлений (radvorg)
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
CREATE TABLE `radvorg` (
  `id` int(11) NOT NULL AUTO_INCREMENT ,
  `orgId` int(11) DEFAULT NULL ,
  `advertId` int(11) DEFAULT NULL ,
  PRIMARY KEY (`id`),
  UNIQUE KEY `orgId` (`orgId`,`advertId`),
  KEY `orgId_2` (`orgId`),
  KEY `advertId` (`advertId`),
  CONSTRAINT `radvorg_fk` FOREIGN KEY (`orgId`) REFERENCES `gsorg` (`id`) ON DELETE CASCADE ON UPDATE CASCADE,
  CONSTRAINT `radvorg_fk1` FOREIGN KEY (`advertId`) REFERENCES `adverts` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB AUTO_INCREMENT=26079063 DEFAULT CHARSET=utf8;



Собственно сами объявления (в тестовой таблице более 7 млн. объявлений):

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
CREATE TABLE `adverts` (
  `id` int(11) NOT NULL AUTO_INCREMENT ,
  `text` text ,
  `cityId` int(11) DEFAULT NULL ,
  `title` text ,
  `themeId` int(11) DEFAULT NULL ,
  `date` date DEFAULT NULL ,
  PRIMARY KEY (`id`),
  KEY `cityId` (`cityId`),
  KEY `themeId` (`themeId`),
  CONSTRAINT `adverts_fk1` FOREIGN KEY (`cityId`) REFERENCES `glcitymy` (`id`),
  CONSTRAINT `adverts_fk2` FOREIGN KEY (`themeId`) REFERENCES `gstheme` (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=23374165 DEFAULT CHARSET=utf8;



Справочник городов (glcitymy)

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
CREATE TABLE `glcitymy` (
  `id` int(11) NOT NULL AUTO_INCREMENT ,
  `name` varchar(250) DEFAULT NULL ,
  `code` varchar(20) DEFAULT NULL ,
  `oblId` int(11) DEFAULT NULL ,
  `index` int(11) DEFAULT NULL ,
  PRIMARY KEY (`id`),
  UNIQUE KEY `code` (`code`),
  UNIQUE KEY `name` (`name`,`oblId`),
  KEY `oblId` (`oblId`),
  KEY `nameCity` (`name`),
  CONSTRAINT `glCityMy_fk_new` FOREIGN KEY (`oblId`) REFERENCES `globlmy` (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=13723 DEFAULT CHARSET=utf8;



Справочник областей (globlmy)

Код: sql
1.
2.
3.
4.
5.
6.
CREATE TABLE `globlmy` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(250) DEFAULT NULL ,
  PRIMARY KEY (`id`),
  UNIQUE KEY `name` (`name`)
) ENGINE=InnoDB AUTO_INCREMENT=90 DEFAULT CHARSET=utf8;



Таблица связи "Организации - Письма" (rmailorg)

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
CREATE TABLE `rmailorg` (
  `id` int(11) NOT NULL AUTO_INCREMENT ,
  `orgId` int(11) DEFAULT NULL ,
  `mailId` int(11) DEFAULT NULL ,
  `date` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  `send` tinyint(1) DEFAULT '0' ,
  PRIMARY KEY (`id`),
  UNIQUE KEY `orgId` (`orgId`,`mailId`),
  KEY `orgId_2` (`orgId`),
  KEY `mailId` (`mailId`),
  CONSTRAINT `rmailorg_fk` FOREIGN KEY (`orgId`) REFERENCES `gsorg` (`id`) ON DELETE CASCADE ON UPDATE CASCADE,
  CONSTRAINT `rmailorg_fk1` FOREIGN KEY (`mailId`) REFERENCES `gsmailing` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB AUTO_INCREMENT=2681667 DEFAULT CHARSET=utf8;
...
Рейтинг: 0 / 0
Помогите оптимизировать запрос. В одной из таблиц записей более 2 млн. Выполнение 30 сек.
    #38600968
dundin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Пока у меня объяснение только в размерах таблиц.
Организаций - 2 млн.
Объявлений - 7 млн.
Между ними связь, которая тоже не менее 7 млн.

Как только все это соединяется - получается шляпа.

Пока решение вижу в подключении сфинкса - там фильтрация по атрибутам происходит достаточно быстро.
Но сфинкс - это геморр с перестроением индексов. В любом случае - это усложнение всей архитектуры,хотелось бы на уровне SQL решить проблему.
...
Рейтинг: 0 / 0
Помогите оптимизировать запрос. В одной из таблиц записей более 2 млн. Выполнение 30 сек.
    #38600978
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dundinСвязь организаций и их объявлений (radvorg)Между конкретной организацией и конкретным объявлением может быть более одной связи?
...
Рейтинг: 0 / 0
Помогите оптимизировать запрос. В одной из таблиц записей более 2 млн. Выполнение 30 сек.
    #38600988
dundin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
miksoftdundinСвязь организаций и их объявлений (radvorg)Между конкретной организацией и конкретным объявлением может быть более одной связи?

Да. Связь "Многие-Ко-Многим". Оно конечно на первый взгляд нелогично - но в определенных случаях одно объявление может относиться к двум-трем разным организациям.
...
Рейтинг: 0 / 0
Помогите оптимизировать запрос. В одной из таблиц записей более 2 млн. Выполнение 30 сек.
    #38600991
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dundinmiksoftпропущено...
Между конкретной организацией и конкретным объявлением может быть более одной связи?

Да. Связь "Многие-Ко-Многим". Оно конечно на первый взгляд нелогично - но в определенных случаях одно объявление может относиться к двум-трем разным организациям.Мне кажется, мой вопрос не понят.
Связь "многие-ко-многим" сама по себе не говорит о количестве этих связей в паре организация+объявление.
...
Рейтинг: 0 / 0
Помогите оптимизировать запрос. В одной из таблиц записей более 2 млн. Выполнение 30 сек.
    #38601001
dundin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
miksoft,

да - не понял с первого раза:)
Нет - связь между конкретным объявлением и конкретной организацией может быть только одна.
Об этом говорит уникальный индекс
Код: sql
1.
UNIQUE KEY `orgId` (`orgId`,`advertId`),


в таблице связи radvorg.
...
Рейтинг: 0 / 0
Помогите оптимизировать запрос. В одной из таблиц записей более 2 млн. Выполнение 30 сек.
    #38601010
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dundinmiksoft,

да - не понял с первого раза:)
Нет - связь между конкретным объявлением и конкретной организацией может быть только одна.
Об этом говорит уникальный индекс
Код: sql
1.
UNIQUE KEY `orgId` (`orgId`,`advertId`),



в таблице связи radvorg.Тогда я бы предложил таблицу radvorg сократить до двух полей, из обоих сделать первичный ключ и из них же в обратном порядке сделать простой индекс. Тогда объем хранимых данных сократится раза в два.
...
Рейтинг: 0 / 0
Помогите оптимизировать запрос. В одной из таблиц записей более 2 млн. Выполнение 30 сек.
    #38601013
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И еще - зачем в запросе используется таблица gsorg, если из нее выбирается только поле id, которое и так получается из других таблиц?
...
Рейтинг: 0 / 0
Помогите оптимизировать запрос. В одной из таблиц записей более 2 млн. Выполнение 30 сек.
    #38601015
dundin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
miksoft ,

спасибо за совет, начал пробовать :) О результатах отпишусь
...
Рейтинг: 0 / 0
Помогите оптимизировать запрос. В одной из таблиц записей более 2 млн. Выполнение 30 сек.
    #38601020
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dundinначал пробоватьПро формат дат не забудьте (см. выше), а то еще и неправильный ответ получите.
...
Рейтинг: 0 / 0
Помогите оптимизировать запрос. В одной из таблиц записей более 2 млн. Выполнение 30 сек.
    #38601109
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dundinMasterZiv,
добавление ORDER BY id ASC погоды не сделало - все также долго.


Так добавление ORDER BY либо не изменит, либо замедлит запрос. Но в любом случае запрос будет уже другой.
И в таком случае нет смысла обсуждать проблемы этого запроса.
...
Рейтинг: 0 / 0
Помогите оптимизировать запрос. В одной из таблиц записей более 2 млн. Выполнение 30 сек.
    #38601119
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
 SELECT DISTINCT gsorg.id id
 FROM gsorg
      INNER JOIN radvorg ON radvorg.orgId = gsorg.id
      INNER JOIN adverts ON adverts.id = radvorg.advertId
      INNER JOIN glcitymy ON glcitymy.id = adverts.cityId
      INNER JOIN globlmy ON globlmy.id = glcitymy.oblId
      LEFT JOIN rmailorg ON rmailorg.orgId = gsorg.id
 WHERE 
       globlmy.id IN (61) AND
       adverts.themeId IN (2) AND
       adverts.date > '2013.11.11' AND
       (rmailorg.orgId IS NULL OR
       rmailorg.send = 0)
LIMIT 0, 10       



Имеем тут 3 SARG-а:

-- globlmy.id IN (61)
-- adverts.themeId IN (2) AND adverts.date > '2013.11.11'
-- rmailorg.orgId IS NULL OR rmailorg.send = 0

Сколько по каждому отфильтровывается записей ( select count(*) from <thetable> where <это условие> сколько даёт ) ?
...
Рейтинг: 0 / 0
Помогите оптимизировать запрос. В одной из таблиц записей более 2 млн. Выполнение 30 сек.
    #38601145
dundin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вообщем то обрезать таблицу radvorg до 2 полей не получилось, т.к. там еще разные нужные поля, но убрал поле id, и сделал первичные ключ из orgId и advertId.

Не сказать что время выполнения значительно сократилось. Может и помогло - но не намного.

По формату даты пока н смотрел - но сейчас это не принципиально - можно это условие вообще убрать - проблема останется.

Вот мои некоторые эксперементы:

Запрос без сортировки и дистинкта выполняется за вполне приемлемое время 0,5 сек.

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
SELECT gsorg.id
  FROM gsorg
       INNER JOIN radvorg ON radvorg.orgId = gsorg.id
       INNER JOIN adverts ON adverts.id = radvorg.advertId
       INNER JOIN glcitymy ON glcitymy.id = adverts.cityId
       INNER JOIN globlmy ON globlmy.id = glcitymy.oblId
       LEFT JOIN rmailorg ON rmailorg.orgId = gsorg.id
  WHERE 1 = 1  
        AND   globlmy.id IN (61) 
        AND   adverts.themeId IN (2) 
        AND   adverts.date > '2013.11.11' 
--        AND  (rmailorg.orgId IS NULL)
--   ORDER BY gsorg.id ASC
LIMIT 0, 10



Добавление дистинкта увеличивает время на 1 сек. Но время все еще приемлемое - 1,5 сек.

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
SELECT DISTINCT gsorg.id
  FROM gsorg
       INNER JOIN radvorg ON radvorg.orgId = gsorg.id
       INNER JOIN adverts ON adverts.id = radvorg.advertId
       INNER JOIN glcitymy ON glcitymy.id = adverts.cityId
       INNER JOIN globlmy ON globlmy.id = glcitymy.oblId
       LEFT JOIN rmailorg ON rmailorg.orgId = gsorg.id
  WHERE 1 = 1  
        AND   globlmy.id IN (61) 
        AND   adverts.themeId IN (2) 
        AND   adverts.date > '2013.11.11' 
--        AND  (rmailorg.orgId IS NULL)
--   ORDER BY gsorg.id ASC
LIMIT 0, 10



Добавление секции ORDER BY, как справедливо заметил MasterZiv, увеличивает время выполнения еще аж на 4 секунды (суммарно уже 5,5 сек.) - поэтому order by убираем - ибо к самой задаче он не нужен. (задача - показать любые (хоть какие то )организации)

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
SELECT DISTINCT gsorg.id
  FROM gsorg
       INNER JOIN radvorg ON radvorg.orgId = gsorg.id
       INNER JOIN adverts ON adverts.id = radvorg.advertId
       INNER JOIN glcitymy ON glcitymy.id = adverts.cityId
       INNER JOIN globlmy ON globlmy.id = glcitymy.oblId
       LEFT JOIN rmailorg ON rmailorg.orgId = gsorg.id
  WHERE 1 = 1  
        AND   globlmy.id IN (61) 
        AND   adverts.themeId IN (2) 
        AND   adverts.date > '2013.11.11' 
--        AND  (rmailorg.orgId IS NULL)
   ORDER BY gsorg.id ASC
LIMIT 0, 10




Примерно 4 секунды добавляет
Код: sql
1.
AND  (rmailorg.orgId IS NULL)

(условие что с этой организацией переписки еще не было)

Ну и еще 5 секунд добавляет COUNT

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
SELECT COUNT(DISTINCT gsorg.id)
  FROM gsorg
       INNER JOIN radvorg ON radvorg.orgId = gsorg.id
       INNER JOIN adverts ON adverts.id = radvorg.advertId
       INNER JOIN glcitymy ON glcitymy.id = adverts.cityId
       INNER JOIN globlmy ON globlmy.id = glcitymy.oblId
       LEFT JOIN rmailorg ON rmailorg.orgId = gsorg.id
  WHERE 1 = 1  
        AND   globlmy.id IN (61) 
        AND   adverts.themeId IN (2) 
        AND   adverts.date > '2013.11.11' 
--        AND  (rmailorg.orgId IS NULL)
--   ORDER BY gsorg.id ASC
LIMIT 0, 10



Т.е. итого 9 -12 секунд с count. (Напомню что COUNT нужен для пагинатора)
...
Рейтинг: 0 / 0
Помогите оптимизировать запрос. В одной из таблиц записей более 2 млн. Выполнение 30 сек.
    #38601150
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dundin,

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
SELECT count(*)
  FROM gsorg
       INNER JOIN radvorg ON radvorg.orgId = gsorg.id
       INNER JOIN adverts ON adverts.id = radvorg.advertId
       INNER JOIN glcitymy ON glcitymy.id = adverts.cityId
       INNER JOIN globlmy ON globlmy.id = glcitymy.oblId
       LEFT JOIN rmailorg ON rmailorg.orgId = gsorg.id
  WHERE globlmy.id IN (61) 
        AND   adverts.themeId IN (2) 
        AND   adverts.date > '2013.11.11' ;




Код: sql
1.
2.
3.
SELECT count(*)
  FROM globlmy 
  WHERE globlmy.id IN (61) 




Код: sql
1.
2.
3.
SELECT count(*)
  FROM adverts
  WHERE adverts.themeId IN (2)  AND   adverts.date > '2013.11.11' ;



Что эти запросы возвращают ?
...
Рейтинг: 0 / 0
Помогите оптимизировать запрос. В одной из таблиц записей более 2 млн. Выполнение 30 сек.
    #38601586
dundin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
MasterZiv,

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
SELECT count(*)
  FROM gsorg
       INNER JOIN radvorg ON radvorg.orgId = gsorg.id
       INNER JOIN adverts ON adverts.id = radvorg.advertId
       INNER JOIN glcitymy ON glcitymy.id = adverts.cityId
       INNER JOIN globlmy ON globlmy.id = glcitymy.oblId
       LEFT JOIN rmailorg ON rmailorg.orgId = gsorg.id
  WHERE globlmy.id IN (61) 
        AND   adverts.themeId IN (2) 
        AND   adverts.date > '2013.11.11' ;



возвращает 191360

Код: sql
1.
2.
3.
SELECT count(*)
  FROM globlmy 
  WHERE globlmy.id IN (61) 



Возвращает 1, и это понятно, ведь globlmy - это справочник областей

Код: sql
1.
2.
3.
SELECT count(*)
  FROM adverts
  WHERE adverts.themeId IN (2)  AND   adverts.date > '2013.11.11' ;



Возвращает 627455

Я так понимаю - что можно попробовать построить индексы по 2 полям?
...
Рейтинг: 0 / 0
Помогите оптимизировать запрос. В одной из таблиц записей более 2 млн. Выполнение 30 сек.
    #38602024
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dundinMasterZiv,
Я так понимаю - что можно попробовать построить индексы по 2 полям?

Нет. Это означает, что твои SARG-и все плохие, и тебе приходится DISTINCT-ом
выжимать из почти 200 тысяч записей твой результат.

Т.е. твой запрос неработоспособен в любом случае.
Можешь его выкидывать. А если учеть, что ты его ещё и раз 10 примерно собираешься выполнять
на один пользовательский экран -- и подавно нужно выкидывать.
...
Рейтинг: 0 / 0
Помогите оптимизировать запрос. В одной из таблиц записей более 2 млн. Выполнение 30 сек.
    #38602403
dundin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
MasterZivНет. Это означает, что твои SARG-и все плохие, и тебе приходится DISTINCT-ом
выжимать из почти 200 тысяч записей твой результат.


Что имеется в виду под словом "SARG-и"? Гугл не помог.
...
Рейтинг: 0 / 0
Помогите оптимизировать запрос. В одной из таблиц записей более 2 млн. Выполнение 30 сек.
    #38602420
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dundinMasterZivНет. Это означает, что твои SARG-и все плохие, и тебе приходится DISTINCT-ом
выжимать из почти 200 тысяч записей твой результат.


Что имеется в виду под словом "SARG-и"? Гугл не помог.Если добавить слово Sybase (взятое из профиля MasterZiv), то вполне гуглится, что это понятие похоже на "предикаты выборки".
...
Рейтинг: 0 / 0
Помогите оптимизировать запрос. В одной из таблиц записей более 2 млн. Выполнение 30 сек.
    #38602928
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dundinMasterZivНет. Это означает, что твои SARG-и все плохие, и тебе приходится DISTINCT-ом
выжимать из почти 200 тысяч записей твой результат.


Что имеется в виду под словом "SARG-и"? Гугл не помог.

SARG = Search ARGument
Это выражения фильтрации записей.
...
Рейтинг: 0 / 0
23 сообщений из 23, страница 1 из 1
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Помогите оптимизировать запрос. В одной из таблиц записей более 2 млн. Выполнение 30 сек.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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