У меня есть две таблицы MySQL, скажем, A и B. A содержит только один столбец varchar (назовем его одним A1) с примерно 23000 записями.В таблице B (70000 записей) есть еще несколько столбцов, один из которых соответствует A1 из таблицы A (назовем это B1).Я хочу знать, какие значения в A не находятся в соответствующем столбце в B, поэтому я использую:
SELECT A1
FROM A
LEFT JOIN B
ON A1 = B1
WHERE B1 IS NULL
В обоих столбцах A1 и B1 определены индексы.Тем не менее этот запрос выполняется очень медленно.Я запустил объяснение, это вывод:
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE A index \N PRIMARY 767 \N 23269 Using index
1 SIMPLE B ALL \N \N \N \N 70041 Using where; Not exists
ОБНОВЛЕНИЕ: SHOW CREATE TABLE
для обеих таблиц (изменил исходные имена);
CREATE TABLE `A` (
`A1` varchar(255) NOT NULL,
PRIMARY KEY (`A1`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8
CREATE TABLE `B` (
`col1` int(10) unsigned NOT NULL auto_increment,
`col2` datetime NOT NULL,
`col3` datetime default NULL,
`col4` datetime NOT NULL,
`col5` varchar(30) NOT NULL,
`col6` int(10) default NULL,
`col7` int(11) default NULL,
`col8` varchar(20) NOT NULL,
`B1` varchar(255) default NULL,
`col10` tinyint(1) NOT NULL,
`col11` varchar(255) default NULL,
PRIMARY KEY (`col1`),
KEY `NewIndex1` (`B1`)
) ENGINE=MyISAM AUTO_INCREMENT=70764 DEFAULT CHARSET=latin1
'другое редактирование: data_length
и index_length
из SHOW TABLE STATUS
table data_length index_length
A 465380 435200
B 5177996 1344512