SQL «как» быстрее, чем «=» производительность с использованием внутреннего соединения - PullRequest
0 голосов
/ 25 января 2019

У нас есть 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" намного быстрее, чем "=" в том же запросе "внутреннего соединения", в чем причина?за этим?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...