Мой ответ такой же, как и у @Ronny. Я также добавляю некоторые предложения по увеличению производительности для вашего SQL. Все мои sql проверены на Mysql Сервер совместной работы 5.6.48.
Пожалуйста, попробуйте следующее SQL.
select
distinct t1.trackingChipNumber
from main as t1 left join
main as t2
on t2.trackingChipNumber = t1.trackingChipNumber and t2.fate in ('Died')
where t1.trackingChipNumber LIKE "%" and t2.fate is null
Я не уверен, как вы добавляете индекс для эта таблица и определение этой таблицы тоже. Вот что я использовал для создания этой таблицы sql:
create table `main` (
`id` int(11) not null auto_increment primary key,
`trackingChipNumber` varchar(20) not null,
`fate` varchar(10) not null,
KEY `index_tcnum_fate` (`trackingChipNumber`, `fate`)) engine = InnoDB;
Я не уверен, подходит ли это для вашего случая, однако после добавления такого индекса запрос в моей песочнице может будь быстрее. Соответствующие планы выполнения следующие.
Перед добавлением индекса все данные будут дважды просканированы в main
таблице.
mysql> explain select
-> distinct t1.trackingChipNumber
-> from main as t1 left join
-> main as t2
-> on t2.trackingChipNumber = t1.trackingChipNumber and t2.fate in ('Died')
-> where t1.trackingChipNumber LIKE "%" and t2.fate is null;
+----+-------------+-------+------+---------------+------+---------+------+------+--------------------------------------------------------------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-------+------+---------------+------+---------+------+------+--------------------------------------------------------------------------+
| 1 | SIMPLE | t1 | ALL | NULL | NULL | NULL | NULL | 3 | Using where; Using temporary |
| 1 | SIMPLE | t2 | ALL | NULL | NULL | NULL | NULL | 3 | Using where; Not exists; Distinct; Using join buffer (Block Nested Loop) |
+----+-------------+-------+------+---------------+------+---------+------+------+--------------------------------------------------------------------------+
2 rows in set (0.00 sec)
После добавления индекса будет использоваться индекс.
mysql> explain select
-> distinct t1.trackingChipNumber
-> from main as t1 left join
-> main as t2
-> on t2.trackingChipNumber = t1.trackingChipNumber and t2.fate in ('Died')
-> where t1.trackingChipNumber LIKE "%" and t2.fate is null;
+----+-------------+-------+-------+------------------+------------------+---------+-------------------------------+------+------------------------------------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-------+-------+------------------+------------------+---------+-------------------------------+------+------------------------------------------------+
| 1 | SIMPLE | t1 | index | index_tcnum_fate | index_tcnum_fate | 34 | NULL | 3 | Using where; Using index; Using temporary |
| 1 | SIMPLE | t2 | ref | index_tcnum_fate | index_tcnum_fate | 22 | lzytest.t1.trackingChipNumber | 1 | Using where; Not exists; Using index; Distinct |
+----+-------------+-------+-------+------------------+------------------+---------+-------------------------------+------+------------------------------------------------+
2 rows in set (0.00 sec)