Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / MySQL [игнор отключен] [закрыт для гостей] / оптимизация запроса / 14 сообщений из 14, страница 1 из 1
29.09.2016, 11:09
    #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
29.09.2016, 11:14
    #39317634
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
оптимизация запроса
crazybite,

Показывайте полностью запрос, его план и DDL всех участвующих таблиц с индексами. Для начала.
...
Рейтинг: 0 / 0
29.09.2016, 11:15
    #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
29.09.2016, 11:30
    #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
29.09.2016, 11:32
    #39317663
crazybite
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
оптимизация запроса
Текст "col1 и col2 ключи. varchar 200 " забыл удалить )
З.Ы. не нашел как редактировать сообщение :\
...
Рейтинг: 0 / 0
29.09.2016, 11:32
    #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
29.09.2016, 11:33
    #39317666
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
оптимизация запроса
crazybite,

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

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

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


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

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


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