У нас есть 2 таблицы:
CREATE TABLE `task_information`
(
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
`project_id` varchar(64) NOT NULL DEFAULT '0',
`task_id` varchar(64) NOT NULL DEFAULT '0',
`machine_id` varchar(16) NOT NULL DEFAULT '0',
PRIMARY KEY (`id`),
KEY `idx_project` (`project_id`,`task_id`),
KEY `idx_task` (`task_id`)
) ENGINE=InnoDB AUTO_INCREMENT=1100523 DEFAULT CHARSET=utf8mb4
CREATE TABLE `task_process`
(
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
`task_id` varchar(64) NOT NULL DEFAULT '0',
`project_id` varchar(64) NOT NULL DEFAULT '0',
`status` varchar(16) NOT NULL DEFAULT '0'
PRIMARY KEY (`id`),
UNIQUE KEY `uniq_task` (`task_id`)
) ENGINE=InnoDB AUTO_INCREMENT=1096437 DEFAULT CHARSET=utf8mb4
Эти две таблицы имеют взаимно-однозначное отношение на основе "task_id".
В этих двух таблицах содержится почти 800 тыс. Записей.Также будет много «успеха» в столбце «статус».Столбец «status» имеет ровно три значения: «success», «fail» и «start», их соотношение составляет примерно 100: 1: 1.
А теперь я хочу выбрать task_id, где указан machined_id, а статус равен «success», мой sql-запрос выглядит так:
select *
from task_information
inner join task_process on task_process.task_id = task_information.task_id
and task_information.machine_id = "RA00906"
where task_process.status="success"\G;
Этот запрос занимает 4,96 с, результатОбъяснение объясняется следующим образом:
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: task_process
partitions: NULL
type: ALL
possible_keys: uniq_task
key: NULL
key_len: NULL
ref: NULL
rows: 760145
filtered: 10.00
Extra: Using where
*************************** 2. row ***************************
id: 1
select_type: SIMPLE
table: task_information
partitions: NULL
type: ref
possible_keys: idx_task
key: idx_task
key_len: 258
ref: task_process.task_id
rows: 1
filtered: 10.00
Extra: Using where
Но если я изменю «=» на «как», скорость станет намного быстрее (около 0,9 секунды):
select status
from task_information
inner join task_process on task_process.task_id = task_information.task_id
and task_information.machine_id = "RA00906"
where task_process.status like "success"
Результат объясненияпримерно так:
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: task_information
partitions: NULL
type: ALL
possible_keys: idx_task
key: NULL
key_len: NULL
ref: NULL
rows: 759749
filtered: 10.00
Extra: Using where
*************************** 2. row ***************************
id: 1
select_type: SIMPLE
table: task_process
partitions: NULL
type: eq_ref
possible_keys: uniq_task
key: uniq_task
key_len: 258
ref: task_information.task_id
rows: 1
filtered: 11.11
Extra: Using where
Оба этих запроса возвращают около 500 строк, но «LIKE» намного быстрее, чем «=», хотя функционально они должны быть примерно одинаковыми.
Может кто-нибудь объяснить мне причину этого?
tl; dr с помощью "LIKE" намного быстрее, чем "=" в том же запросе "внутреннего соединения", в чем причина?за этим?