powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / MySQL [игнор отключен] [закрыт для гостей] / оптимизация запроса
14 сообщений из 14, страница 1 из 1
оптимизация запроса
    #39317625
crazybite
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем привет.
Существует запрос типа
SELECT
(SELECT count(`id`) FROM `table1` WHERE `col1`= 1 and `col2` = 'some text') as 'one',
(SELECT count(`id`) FROM `table1` WHERE `col1`= 2 and `col2` = 'some text') as 'two',
(SELECT count(`id`) FROM `table1` WHERE `col1`= 3 and `col2` = 'some text') as 'three'
....;
Запрос довольно большой, хотелось бы знать, есть возможность ли его оптимизировать? Заставить работать быстрее?
Поиск как правило идет по ключевым полям.
...
Рейтинг: 0 / 0
оптимизация запроса
    #39317634
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
crazybite,

Показывайте полностью запрос, его план и DDL всех участвующих таблиц с индексами. Для начала.
...
Рейтинг: 0 / 0
оптимизация запроса
    #39317636
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
SELECT
  SUM(`col1`= 1) as 'one'
, SUM(`col1`= 2) as 'one'
-- ...
FROM
  table1
WHERE 
  `col2` = 'some text'
...
Рейтинг: 0 / 0
оптимизация запроса
    #39317658
crazybite
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Akina,
Я некорректно написал, some text имеется ввиду разный в каждом сравнении.. Исправлю первый пост.


miksoft,
col1 и col2 ключи. varchar 200
Код: 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.
CREATE TABLE `table1` (
	`id` INT(11) NOT NULL AUTO_INCREMENT,
	`col1` VARCHAR(50) NULL DEFAULT NULL,
	`col2` VARCHAR(50) NULL DEFAULT NULL,
	PRIMARY KEY (`id`),
	INDEX `col1` (`col1`),
	INDEX `col2` (`col2`)
)
COLLATE='utf8_general_ci'
ENGINE=InnoDB
;
CREATE TABLE `table2` (
	`id` INT(11) NOT NULL AUTO_INCREMENT,
	`t1_id` INT(11) NOT NULL,
	`col1` VARCHAR(50) NULL DEFAULT NULL,
	`col2` VARCHAR(50) NULL DEFAULT NULL,
	PRIMARY KEY (`id`),
	INDEX `t1_id` (`t1_id`),
	INDEX `col1` (`col1`),
	INDEX `col2` (`col2`)
)
COLLATE='utf8_general_ci'
ENGINE=InnoDB
;

SELECT 
(SELECT count(`id`) FROM `table1` WHERE `col1`= 1 and `col2` = 'some text1') as 'one',
(SELECT count(`id`) FROM `table1` WHERE `col1`= 2 and `col2` = 'some text2') as 'two',
(SELECT count(`id`) FROM `table1` WHERE `col1`= 3 and `col2` = 'some text3') as 'three',
(SELECT count(`table1`.`id`) FROM `table1` LEFT JOIN `table2` ON `table1`.id = `table2`.t1_id WHERE `table2`.`col1`= 1 and `table2`.`col2` = 'some text4') as 't2 one';
...
Рейтинг: 0 / 0
оптимизация запроса
    #39317663
crazybite
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Текст "col1 и col2 ключи. varchar 200 " забыл удалить )
З.Ы. не нашел как редактировать сообщение :\
...
Рейтинг: 0 / 0
оптимизация запроса
    #39317665
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Какая нафиг разница?
Код: sql
1.
2.
3.
4.
5.
6.
SELECT
  SUM(`col1`= 1 and `col2` = 'some text1') as 'one'
, SUM(`col1`= 2 and `col2` = 'some text2') as 'one'
-- ...
FROM
  table1
...
Рейтинг: 0 / 0
оптимизация запроса
    #39317666
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
crazybite,

Для чего в запросе LEFT JOIN, а не просто JOIN?
...
Рейтинг: 0 / 0
оптимизация запроса
    #39317667
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
miksoftДля чего в запросе LEFT JOIN, а не просто JOIN?Товарищ просто не знает о существовании INNER JOIN.
...
Рейтинг: 0 / 0
оптимизация запроса
    #39317674
crazybite
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
miksoft,
Не знаю, всегда использую LEFT или INNER.
Akina,
В данном случае INNER будет выдавать не полный результат
= 'some textN' может быть is null, is not null
...
Рейтинг: 0 / 0
оптимизация запроса
    #39317687
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
crazybiteВ данном случае INNER будет выдавать не полный результатРезультат будет точно такой же из-за условий в секции WHERE.

Так что рекомендую слово LEFT убрать.

В зависимости от селективности полей, вероятно, еще имеет смысл сделать индекс (`col1`,`col2`) у обеих таблиц.
...
Рейтинг: 0 / 0
оптимизация запроса
    #39317758
crazybite
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
miksoft,
Немного не понял про индексы...
Код: sql
1.
2.
3.
	
INDEX `col1` (`col1`, `col2`),
INDEX `col2` (`col2`, `col1`)


Вот так вот? Что это даст?
А все же как мне сделать этот SELECT с JOINами как показал Akina? Это будет быстрее чем первоначальный вариант?
...
Рейтинг: 0 / 0
оптимизация запроса
    #39318016
crazybite
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В итоге просто убрать LEFT? Это все оптимизирует? :)
...
Рейтинг: 0 / 0
оптимизация запроса
    #39318051
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
crazybite
Код: sql
1.
INDEX `col1` (`col1`, `col2`),

Одного этого достаточно.
Нужен он или нет - пока сказать невозможно, т.к. вы не показали план запроса и неизвестна статистика распределения данных. Если поле `col1` уникально или близко к тому, то этот индекс не нужен.
...
Рейтинг: 0 / 0
оптимизация запроса
    #39318320
crazybite
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
miksoft,
Спасибо!
...
Рейтинг: 0 / 0
14 сообщений из 14, страница 1 из 1
Форумы / MySQL [игнор отключен] [закрыт для гостей] / оптимизация запроса
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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