powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Помощь в оптимизации таблицы + помошь в выборке всех записей из связанной таблицы
12 сообщений из 12, страница 1 из 1
Помощь в оптимизации таблицы + помошь в выборке всех записей из связанной таблицы
    #39431292
tonnazh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте. Нужен совет по оптимизации таблицы и дополнению.
Имеется
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
CREATE TABLE `couriers_holidays` (
	`id` INT(10) NOT NULL AUTO_INCREMENT,
	`hidden` TINYINT(1) UNSIGNED ZEROFILL NOT NULL,
	`disabled` TINYINT(1) UNSIGNED ZEROFILL NOT NULL,
	`courier` INT(10) UNSIGNED NOT NULL,
	`creater` INT(10) UNSIGNED NOT NULL,
	`date` DATE NOT NULL,
	`type` TINYINT(1) UNSIGNED ZEROFILL NOT NULL COMMENT '0 - выходной, 1 - рабочий',
	`status` TINYINT(1) UNSIGNED ZEROFILL NOT NULL COMMENT '0 - в обработке, 1 - принято, 2 - отклонено, 3 отменено',
	`text` TEXT NULL COMMENT 'Сопроводить запрос текстом',
	`answer` TEXT NULL COMMENT 'Ответ в случае отказа',
	PRIMARY KEY (`id`),
	INDEX `FK_couriers_holidays_couriers` (`courier`),
	INDEX `FK_couriers_holidays_users` (`creater`),
	CONSTRAINT `FK_couriers_holidays_couriers` FOREIGN KEY (`courier`) REFERENCES `couriers` (`id`),
	CONSTRAINT `FK_couriers_holidays_users` FOREIGN KEY (`creater`) REFERENCES `users` (`id`)
)
COLLATE='utf8_general_ci'
ENGINE=InnoDB
AUTO_INCREMENT=10
;


Код: 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.
CREATE TABLE `couriers` (
	`id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
	`disabled` TINYINT(1) UNSIGNED NOT NULL,
	`hidden` TINYINT(1) UNSIGNED NOT NULL,
	`city` INT(10) UNSIGNED NOT NULL,
	`store` INT(10) UNSIGNED NOT NULL,
	`type` TINYINT(1) UNSIGNED NOT NULL COMMENT 'Тип курьера: 0 = пеший, 1 = авто',
	`name` VARCHAR(150) NOT NULL,
	`colorId` TINYINT(2) UNSIGNED NULL DEFAULT NULL COMMENT 'Цвет курьера на карте',
	`phone` VARCHAR(100) NOT NULL,
	`phone2` VARCHAR(100) NULL DEFAULT NULL,
	`birthday` VARCHAR(100) NULL DEFAULT NULL,
	`email` VARCHAR(50) NULL DEFAULT NULL,
	`address` TINYTEXT NULL,
	`addressByID` TINYTEXT NULL,
	`geo` TINYTEXT NULL COMMENT 'Геокодированные координаты',
	`maxWeight` DECIMAL(10,3) UNSIGNED NULL DEFAULT '10.000' COMMENT 'Максимальный вес, который может взять курьер',
	`salary` TINYINT(3) UNSIGNED NULL DEFAULT '0' COMMENT 'На зарплате или сдельно',
	PRIMARY KEY (`id`),
	INDEX `FK_couriers_citys` (`city`),
	INDEX `FK_couriers_stores` (`store`),
	CONSTRAINT `FK_couriers_citys` FOREIGN KEY (`city`) REFERENCES `citys` (`id`) ON UPDATE CASCADE,
	CONSTRAINT `FK_couriers_stores` FOREIGN KEY (`store`) REFERENCES `stores` (`id`) ON UPDATE CASCADE
)
COMMENT='Курьеры'
COLLATE='utf8_general_ci'
ENGINE=InnoDB
AUTO_INCREMENT=267
;


Код: 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.
CREATE TABLE `log` (
	`id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
	`disabled` TINYINT(1) UNSIGNED NOT NULL,
	`hidden` TINYINT(1) UNSIGNED NOT NULL,
	`public` TINYINT(1) UNSIGNED NOT NULL DEFAULT '0' COMMENT 'Если 1 - видят клиенты',
	`courierCanSee` TINYINT(1) UNSIGNED NOT NULL DEFAULT '0' COMMENT 'Если 1, то курьер видит этот лог',
	`user` INT(10) UNSIGNED NULL DEFAULT NULL COMMENT 'Кто',
	`table` VARCHAR(50) NULL DEFAULT NULL COMMENT 'Где',
	`tableId` INT(10) UNSIGNED NULL DEFAULT NULL COMMENT 'ID изменненой записи в таблице',
	`date` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'Когда',
	`text` TEXT NULL COMMENT 'Что',
	`textId` INT(10) UNSIGNED NULL DEFAULT NULL COMMENT 'ИД комментария.',
	`ip` VARCHAR(16) NULL DEFAULT NULL,
	`USER_AGENT` TINYTEXT NULL COMMENT 'Данные о браузере клиента',
	`USER_AGENT_lite` TINYTEXT NULL,
	PRIMARY KEY (`id`),
	INDEX `fk_log_users` (`user`),
	CONSTRAINT `log_ibfk_1` FOREIGN KEY (`user`) REFERENCES `users` (`id`) ON UPDATE CASCADE
)
COMMENT='Лог'
COLLATE='utf8_general_ci'
ENGINE=InnoDB
AUTO_INCREMENT=1074348
;



Код: 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.
SELECT
			a.disabled
			,CASE a.status
			WHEN 1 THEN 11
			ELSE a.status
			END
			AS status
			,date_format(a.date,'%d %b
%W') as date1

			,CONCAT_WS('','<strong>',IF(a.type=0,'Выходной','Рабочий день')
			, '</strong> для '
			,CONCAT(SUBSTRING_INDEX(SUBSTRING_INDEX(b.name, ' ', 1), ' ', -1), ' ', LEFT(SUBSTRING_INDEX(SUBSTRING_INDEX(b.name, ' ', 2), ' ', -1),1), '.', LEFT(SUBSTRING_INDEX(SUBSTRING_INDEX(b.name, ' ', 3), ' ', -1),1),'.')
			,if(a.text ='' OR a.text IS NULL,'',CONCAT_WS('','<br><small>&#8658; ',a.text,'</small>'))
			,if(a.answer ='' OR a.answer IS NULL,'',CONCAT_WS('','<br><small>&#8656; ',a.answer,'</small>'))
			) as cell

			,CONCAT_WS(''
			,'<div class=\"btn-toolbar\"><div class=\"btn-group\">'
			,if(a.status=1,CONCAT_WS('','<a class=\"btn btn-danger changeRecord\" recordSource=\"couriers_holidays\" recordName=\"status\" recordVal=\"2\"  recordId=\"',a.`id`,'\">','Отклонить','</a>','<a class=\"btn btn-danger changeRecord\" recordSource=\"couriers_holidays\" recordName=\"status\" recordVal=\"3\"  recordId=\"',a.`id`,'\">','Отменить','</a>'),'')
			,if(a.status=2,CONCAT_WS('','<a class=\"btn btn-success changeRecord\" recordSource=\"couriers_holidays\" recordName=\"status\" recordVal=\"1\"  recordId=\"',a.`id`,'\">','Принять','</a>','<a class=\"btn btn-danger changeRecord\" recordSource=\"couriers_holidays\" recordName=\"status\" recordVal=\"3\"  recordId=\"',a.`id`,'\">','Отменить','</a>'),'')
			,if(a.status=3,CONCAT_WS('','<a class=\"btn btn-success changeRecord\" recordSource=\"couriers_holidays\" recordName=\"status\" recordVal=\"1\"  recordId=\"',a.`id`,'\">','Принять','</a>','<a class=\"btn btn-danger changeRecord\" recordSource=\"couriers_holidays\" recordName=\"status\" recordVal=\"2\"  recordId=\"',a.`id`,'\">','Отклонить','</a>'),'')
			,'</div></div>'
			)
			AS statuses

			FROM couriers_holidays a, couriers b, users c
			WHERE a.courier=b.id
			AND a.creater=c.id
			AND a.disabled =0
			AND a.hidden=0
			AND a.status IN (1,2,3)
			ORDER BY a.date DESC,b.name
			LIMIT 10


Запрос рабочий. Хочу оптимизировать запрос SELECT, устранить ошибки которые по не знанию не могу или не вижу.
Во-первых, не нравится вот это: (a.answer ='' OR a.answer IS NULL . Понимаю что тут можно как-то подругому, но не понимаю как. Если запись создается из программы, то a.answer, не NULL, а '', но наверняка можно сделать как-то проще без OR.
Во-вторых, совета, может быть я могу как-то оптимизировать запрос используя неиспользуемые мной функции mysql

Ну и самое важное. Нужно в запрос добавить через запятую все связанные данные из таблицы log. Связь происходит через a.id=log.tableId. Не знаю как это сделать.
В идеале это должно быть внутри CONCAT_WS после ,if(a.answer ='' OR a.answer IS NULL,'',CONCAT_WS('','<br><small>⇐ ',a.answer,'</small>'))
...
Рейтинг: 0 / 0
Помощь в оптимизации таблицы + помошь в выборке всех записей из связанной таблицы
    #39431297
tonnazh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Попробовал такой вот вариант:
Код: 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.
SELECT
			a.disabled
			,CASE a.status
			WHEN 1 THEN 11
			ELSE a.status
			END
			AS status
			,date_format(a.date,'%d %b
%W') as date1

			,CONCAT_WS('','<strong>',IF(a.type=0,'Выходной','Рабочий день')
			, '</strong> для '
			,CONCAT(SUBSTRING_INDEX(SUBSTRING_INDEX(b.name, ' ', 1), ' ', -1), ' ', LEFT(SUBSTRING_INDEX(SUBSTRING_INDEX(b.name, ' ', 2), ' ', -1),1), '.', LEFT(SUBSTRING_INDEX(SUBSTRING_INDEX(b.name, ' ', 3), ' ', -1),1),'.')
			,'Запрос сделал: '
			,CONCAT(SUBSTRING_INDEX(SUBSTRING_INDEX(c.name, ' ', 1), ' ', -1), ' ', LEFT(SUBSTRING_INDEX(SUBSTRING_INDEX(c.name, ' ', 2), ' ', -1),1), '.', LEFT(SUBSTRING_INDEX(SUBSTRING_INDEX(c.name, ' ', 3), ' ', -1),1),'.')
			,if(a.text ='' OR a.text IS NULL,'',CONCAT_WS('','<br><small>&#8658; ',a.text,'</small>'))
			,if(a.answer ='' OR a.answer IS NULL,'',CONCAT_WS('','<br><small>&#8656; ',a.answer,'</small>'))
			,GROUP_CONCAT(CAST(d.id AS CHAR) ORDER BY d.id SEPARATOR ', ')
			) as cell

			,CONCAT_WS(''
			,'<div class=\"btn-toolbar\"><div class=\"btn-group\">'
			,if(a.status=1,CONCAT_WS('','<a class=\"btn btn-danger changeRecord\" recordSource=\"couriers_holidays\" recordName=\"status\" recordVal=\"2\"  recordId=\"',a.`id`,'\">','Отклонить','</a>','<a class=\"btn btn-danger changeRecord\" recordSource=\"couriers_holidays\" recordName=\"status\" recordVal=\"3\"  recordId=\"',a.`id`,'\">','Отменить','</a>'),'')
			,if(a.status=2,CONCAT_WS('','<a class=\"btn btn-success changeRecord\" recordSource=\"couriers_holidays\" recordName=\"status\" recordVal=\"1\"  recordId=\"',a.`id`,'\">','Принять','</a>','<a class=\"btn btn-danger changeRecord\" recordSource=\"couriers_holidays\" recordName=\"status\" recordVal=\"3\"  recordId=\"',a.`id`,'\">','Отменить','</a>'),'')
			,if(a.status=3,CONCAT_WS('','<a class=\"btn btn-success changeRecord\" recordSource=\"couriers_holidays\" recordName=\"status\" recordVal=\"1\"  recordId=\"',a.`id`,'\">','Принять','</a>','<a class=\"btn btn-danger changeRecord\" recordSource=\"couriers_holidays\" recordName=\"status\" recordVal=\"2\"  recordId=\"',a.`id`,'\">','Отклонить','</a>'),'')
			,'</div></div>'
			)
			AS statuses

			FROM couriers_holidays a, couriers b, users c,log d
			WHERE a.courier=b.id
			AND a.creater=c.id
			AND a.id=d.tableId
			AND a.disabled =0
			AND a.hidden=0
			AND a.status IN (1,2,3)
		
			GROUP BY a.id,a.date
			ORDER BY a.date DESC,b.name
			LIMIT 10


Но недостатком является то, что не у всех записей из таблицы couriers_holidays имеется запись в log, а значит выводятся только те у которых есть сопостовимые записи (((
...
Рейтинг: 0 / 0
Помощь в оптимизации таблицы + помошь в выборке всех записей из связанной таблицы
    #39431314
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tonnazhнедостатком является то, что не у всех записей из таблицы couriers_holidays имеется запись в logЗначит, картезианка неприменима, только стороннее связывание (LEFT JOIN).

tonnazhХочу оптимизировать запрос SELECT
Нечего тут оптимизировать. Кроме создания правильного индекса.

tonnazhне нравится вот это: (a.answer ='' OR a.answer IS NULL .
А кто заставлял делать это поле NULLable?

tonnazhоптимизировать запрос используя неиспользуемые мной функции mysql
Любая функция тормозит запрос. Функция не в секции SELECT - серьёзно тормозит.
...
Рейтинг: 0 / 0
Помощь в оптимизации таблицы + помошь в выборке всех записей из связанной таблицы
    #39431427
tonnazh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Akina,
с left join понял, спасибо.

А что с индексом не так, в какой табилце??
...
Рейтинг: 0 / 0
Помощь в оптимизации таблицы + помошь в выборке всех записей из связанной таблицы
    #39431439
Фотография ScareCrow
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tonnazh,

Explain?
...
Рейтинг: 0 / 0
Помощь в оптимизации таблицы + помошь в выборке всех записей из связанной таблицы
    #39431669
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tonnazhчто с индексом не так,Оптимального индекса - тупо нет.
...
Рейтинг: 0 / 0
Помощь в оптимизации таблицы + помошь в выборке всех записей из связанной таблицы
    #39431676
tonnazh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
idselect_typetabletypepossible_keyskeykey_lenrefrowsExtra1PRIMARYaALLFK_couriers_holidays_couriers;FK_couriers_holidays_users1Using where; Using temporary; Using filesort1PRIMARYbeq_refPRIMARYPRIMARY4alinagrey_2f1.a.courier11PRIMARYceq_refPRIMARYPRIMARY4alinagrey_2f1.a.creater13DEPENDENT SUBQUERYeALL596157Using where2DEPENDENT SUBQUERYdALL596157Using where
К сожалению с explain не знаком вообще. Буду курить в эту сторону. Но кто-то может уже что-то подсказать?
На текущий момент запрос около 2-х секунд делается. Что мега долго...
...
Рейтинг: 0 / 0
Помощь в оптимизации таблицы + помошь в выборке всех записей из связанной таблицы
    #39431678
tonnazh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Akina,
не понимаю, если не сложно, объясните что именно не так и что в данном случае читать?
...
Рейтинг: 0 / 0
Помощь в оптимизации таблицы + помошь в выборке всех записей из связанной таблицы
    #39431740
Фотография ScareCrow
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
не все поля входят в аггрегатные функции или group by
...
Рейтинг: 0 / 0
Помощь в оптимизации таблицы + помошь в выборке всех записей из связанной таблицы
    #39432453
Фотография javajdbc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Akinaкартезианка

? не перепутали ли вы?
...
Рейтинг: 0 / 0
Помощь в оптимизации таблицы + помошь в выборке всех записей из связанной таблицы
    #39432454
Фотография javajdbc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ScareCrowне все поля входят в аггрегатные функции или group by


...не всегда обязательно, но в данном случае, похоже,
вы 100% правы...
...
Рейтинг: 0 / 0
Помощь в оптимизации таблицы + помошь в выборке всех записей из связанной таблицы
    #39432487
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
javajdbcне перепутали ли вы?Нет. Картезианское, оно же прямое, оно же декартово, произведение, оно же CROSS JOIN.
...
Рейтинг: 0 / 0
12 сообщений из 12, страница 1 из 1
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Помощь в оптимизации таблицы + помошь в выборке всех записей из связанной таблицы
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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