私は2つのテーブルidentities
とevents
を持っています。なぜこのMySQL INはWHERE ORよりも時間がかかりますか?
identities
は、2つの列、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 = '[email protected]' OR _p = '[email protected]' OR _p = '[email protected]' OR _p = '[email protected]' ORDER BY _t
のみ20msのとき、彼らを取ります。この1つは一方で
SELECT SQL_NO_CACHE * FROM events WHERE _p IN (SELECT identity2 FROM identities WHERE identity1 = '[email protected]') ORDER BY _t
は、〜40秒かかります基本的に同じですか?
編集:
この内部クエリが取る3,3ms:
SELECT SQL_NO_CACHE identity2 FROM identities WHERE identity1 = '[email protected]'
「WHEREフィールドIN(値リスト)」は、WHEREフィールド=値1 ORフィールド=値2 OR ...として扱うことができますが、WHERE IN(サブクエリ)はできません。 MySQLのためのもの。あなたはもう少し[ここ]を読むことができます(http://stackoverflow.com/questions/19654878/inner-join-select-ab-on-a-and-b-vs-where-ab-in-selecta-b- in-mysql/19655121#19655121) –
ニース、@AlmaDo、これを回答として送ってください、私はそれを受け入れます。 – dmmd
また、答えについてもう少し詳しく説明できれば、それは素晴らしいことでしょう。 – dmmd