Из моего исследования я даже не уверен, что можно избежать временного / filesort с помощью следующего запроса из-за группы по и по порядку. Я также не из тех, кто спрашивает, не проведя кучу собственных исследований. Но если кто-нибудь может помочь выяснить, как избежать сортировки файлов или указать мне правильное направление - даже если он полностью переписывает запрос или предлагает что-то на стороне кода, это было бы очень признательно. Я полностью уперся в стену, пытаясь понять это. Внизу есть ссылка на результат объяснения.
explain select CONCAT(scfs.name, ' ',scfs.state,' ',scfs.zip_code) as scfname, scfs.zip_code, IF(date(s.scan_datetime) <= date(NOW()),date(s.scan_datetime),null) as scandate, count(*) as total,
sum(case when s.delivery_status = 1 then 1 else 0 end) as final
from order_addresses oa
left join pkg_data_unique s
on oa.trace_code = s.pkg_trace_code
inner join scf_zip_codes z
on SUBSTR(oa.zip,1,3) = z.zip_code
inner join scfs scfs
on z.scf_zip_code = scfs.zip_code
where oa.order_id = 160387
group by 1,2,3
order by scfs.zip_code, scandate
СОЗДАТЬ АДРЕС ДЛЯ ЗАКАЗА
CREATE TABLE order_addresses (
id int(10) unsigned NOT NULL AUTO_INCREMENT,
order_id int(11) NOT NULL,
name varchar(100) COLLATE utf8_unicode_ci NOT NULL,
address varchar(100) COLLATE utf8_unicode_ci NOT NULL,
address2 varchar(100) COLLATE utf8_unicode_ci NOT NULL,
city varchar(50) COLLATE utf8_unicode_ci NOT NULL,
state varchar(15) COLLATE utf8_unicode_ci NOT NULL,
zip char(5) COLLATE utf8_unicode_ci NOT NULL,
zip4 int(11) NOT NULL,
imb_digits char(31) COLLATE utf8_unicode_ci NOT NULL,
trace_code char(20) COLLATE utf8_unicode_ci NOT NULL,
created_at timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
updated_at timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
deleted_at timestamp NULL DEFAULT NULL,
PRIMARY KEY (id),
UNIQUE KEY order_address_unique
(order_id,imb_digits,name,address,address2,city,state,zip),
KEY order_addresses_order_id_index (order_id),
KEY order_addresses_name_index (name),
KEY order_addresses_address_index (address),
KEY order_addresses_city_index (city),
KEY order_addresses_state_index (state),
KEY order_addresses_zip_index (zip),
KEY order_addresses_imb_digits_index (imb_digits),
KEY order_addresses_trace_code_index (trace_code),
KEY order_id_trace_code (order_id,trace_code) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=487714542 DEFAULT CHARSET=utf8
COLLATE=utf8_unicode_ci ROW_FORMAT=COMPACT
УНИКАЛЬНАЯ ТАБЛИЦА ДАННЫХ PKG
CREATE TABLE pkg_data_unique (
id int(10) unsigned NOT NULL AUTO_INCREMENT,
zip char(5) COLLATE utf8_unicode_ci NOT NULL,
opcode int(11) NOT NULL,
pkg_trace_code char(20) COLLATE utf8_unicode_ci NOT NULL,
scan_datetime datetime NOT NULL,
original_scan_datetime datetime NOT NULL,
delivery_status int(11) NOT NULL,
created_at timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
updated_at timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
PRIMARY KEY (id),
UNIQUE KEY pkg_data_unique_pkg_trace_code_index (pkg_trace_code) USING BTREE,
KEY pkg_data_unique_zip_index (zip),
KEY pkg_data_unique_opcode_index (opcode),
KEY pkg_data_unique_scan_datetime_index (scan_datetime),
KEY pkg_data_unique_delivery_status_index (delivery_status),
KEY pkg_data_unique_original_scan_datetime (original_scan_datetime)
) ENGINE=InnoDB AUTO_INCREMENT=490667214 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci ROW_FORMAT=COMPACT
Почтовые индексы SCF
CREATE TABLE scf_zip_codes (
id int(10) unsigned NOT NULL AUTO_INCREMENT,
scf_zip_code varchar(3) COLLATE utf8_unicode_ci NOT NULL,
zip_code varchar(3) COLLATE utf8_unicode_ci NOT NULL,
created_at timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
updated_at timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
PRIMARY KEY (id),
KEY scf_zip_codes_scf_zip_code_index (scf_zip_code),
KEY scf_zip_codes_zip_code_index (zip_code)
) ENGINE=InnoDB AUTO_INCREMENT=916 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci ROW_FORMAT=COMPACT
SCFS
CREATE TABLE scfs (
id int(10) unsigned NOT NULL AUTO_INCREMENT,
label_id bigint(20) unsigned NOT NULL,
zip_code varchar(5) COLLATE utf8_unicode_ci NOT NULL,
name varchar(255) COLLATE utf8_unicode_ci NOT NULL,
state varchar(255) COLLATE utf8_unicode_ci NOT NULL,
locale_key varchar(255) COLLATE utf8_unicode_ci NOT NULL,
created_at timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
updated_at timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
PRIMARY KEY (id),
UNIQUE KEY scfs_label_id_unique (label_id),
UNIQUE KEY scfs_zip_code_unique (zip_code),
KEY scfs_name_index (name),
KEY scfs_state_index (state)
) ENGINE=InnoDB AUTO_INCREMENT=196 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci ROW_FORMAT=COMPACT
Добавлены таблицы создания шоу для каждой таблицы






figure out how to avoid the filesort or point me in the correct direction
Альтернатива (ы) включают изменение цели вашего запроса.
group by 1,2,3
order by scfs.zip_code, scandate
GROUP BY может включать файловую сортировку и временную таблицу.
ORDER BY обязательно будет включать (другую) файловую сортировку и временную таблицу, потому что она не соответствует GROUP BY. Нет, переключение на GROUP BY 2,1,3 (поскольку столбец 2 - это почтовый индекс) не поможет.
Если вы можете жить с этим, GROUP BY 2,1,3 ORDER BY 2,1,3, то вы можете избавиться от одной файловой сортировки и получить примерно такой же результат.
Ваш запрос "медленный"? "Filesort" - не главный убийца производительности.
Есть несколько вещей, которые могут немного ускорить запрос:
CHARACTER SET ascii.PRIMARY KEY BTree, чтобы найти строку. Подумайте, какие вторичные индексы, если таковые имеются, можно повысить до PRIMARY KEY.date(s.scan_datetime) <= date(NOW()) -> s.scan_datetime <= CURDATE()sum(case when s.delivery_status = 1 then 1 else 0 end) => sum(case when s.delivery_status = 1), поскольку логическое выражение принимает значение 1 или 0.INDEX(a), INDEX(a,b) -> первым может быть DROPped без потери функциональности.scfs имеет 3 уникальных ключа; id кажется бесполезным. Сделайте zipcode PK и сделайте его CHAR(5) CHARACTER SET ascii. Это будет 5 байтов вместо 4 байтов идентификатора.(255) вслепую; выберите меньшее (но безопасное) значение.Лучше поздно, чем никогда. Просто вошел в систему впервые за некоторое время, и это определенно помогло, когда вы ответили. Извините за задержку
добавьте показать создать таблицу для каждой таблицы