У меня есть две таблицы, identities
и events
.Почему этот MySQL IN занимает намного больше времени, чем ГДЕ ИЛИ?
identities
имеет только две колонки, identity1
и identity2
и оба имеют индекс ХАШ.
events
имеет ~ 50 столбцов и столбец _p
имеет ИНДЕКС ХОШ.
CREATE TABLE `identities` (
`identity1` varchar(255) NOT NULL DEFAULT '',
`identity2` varchar(255) DEFAULT NULL,
UNIQUE KEY `uniques` (`identity1`,`identity2`),
KEY `index2` (`identity2`) USING HASH,
KEY `index1` (`identity1`) USING HASH
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
-
CREATE TABLE `events` (
`rowid` int(11) NOT NULL AUTO_INCREMENT,
`_p` varchar(255) NOT NULL,
`_t` int(10) NOT NULL,
`_n` varchar(255) DEFAULT '',
`returning` varchar(255) DEFAULT NULL,
`referrer` varchar(255) DEFAULT NULL,
`url` varchar(255) DEFAULT NULL,
[...]
`fcc_already_sells_online` varchar(255) DEFAULT NULL,
UNIQUE KEY `_p` (`_p`,`_t`,`_n`),
KEY `rowid` (`rowid`),
KEY `IDX_P` (`_p`) USING HASH
) ENGINE=InnoDB AUTO_INCREMENT=5231165 DEFAULT CHARSET=utf8;
Итак, почему же этот вопрос:
SELECT SQL_NO_CACHE * FROM events WHERE _p IN (SELECT identity2 FROM identities WHERE identity1 = '[email protected]') ORDER BY _t
занимает ~ 40 секунд, в то время как этот:
SELECT SQL_NO_CACHE * FROM events WHERE _p = '[email protected]' OR _p = '[email protected]' OR _p = '[email protected]' OR _p = '[email protected]' ORDER BY _t
принимает только 20мс, когда они в основном то же самое?
редактировать:
Этот внутренний запрос занимает 3,3ms:
SELECT SQL_NO_CACHE identity2 FROM identities WHERE identity1 = '[email protected]'
Ссылка: 'WHERE field IN (список значений)' может рассматриваться как 'WHERE field = value1 OR field = value2 OR ...' but 'WHERE IN (subquery)' can not, это другое для MySQL. Вы можете прочитать немного больше [здесь] (http://stackoverflow.com/questions/19654878/inner-join-select-ab-on-a-and-b-vs-where-ab-in-selecta-b- in-mysql/19655121 # 19655121) –
Nice, @AlmaDo, отправьте это как ответ, и я приму это. – dmmd
Кроме того, если бы вы могли подробнее рассказать об этом, это было бы здорово. – dmmd