У меня есть 3 таблицы в MySQL:MySQL первичного ключа для того пара влияет РЕГИСТРИРУЙТЕСЬ СКОРОСТЬ
innodb_verion 1.1.8
version 5.5.29-log
Table: artist
Columns:
id int(11)
new_id varchar(50)
Table: collection
Columns:
id int(11)
new_id varchar(50)
Table: artist_collection
Columns:
artist_id int(11) PK
collection_id int(11) PK
Таблицы художника и коллекция содержит 100 строк (I просто вытащил подмножество для проверки этой проблемы)
Таблица artist_collection содержит 8 миллионов + строк и имеет первичный ключ, созданный как:
ALTER TABLE artist_collection ADD PRIMARY KEY (artist_id,collection_id);
Когда я тождественны присоединяется к художнику и коллекции, коллекция занимает значительно больше времени, чем художник:
SELECT artist.new_id AS 'i' FROM artist INNER JOIN artist_collection ON artist.id=artist_collection.artist_id LIMIT 100;
100 row(s) returned 0.001 sec
SELECT collection.new_id AS 'i' FROM collection INNER JOIN artist_collection ON collection.id=artist_collection.collection_id LIMIT 100;
100 row(s) returned 2.636 sec
Это большое дело, потому что эти исходные таблицы составляют 10 миллионов + строк, и я не хочу использовать LIMIT в моих запросах. Даже когда я сделал LIMIT 1000, медленный запрос займет ~ 35 секунд, тогда как быстрый был ~ 0,020 секунд. Я тогда ОБЪЯСНИТЬ РАСПРОСТРАНЕНИЯ на обоих запросов, чтобы посмотреть, что происходит на самом деле:
EXPLAIN EXTENDED SELECT artist.id AS 'i' FROM artist INNER JOIN artist_collection ON artist.id=artist_collection.artist_id LIMIT 100;
id select_type table type possible_keys key key_len ref rows filtered Extra
1 SIMPLE artist ALL NULL NULL NULL NULL 82 100.00
1 SIMPLE artist_collection ref PRIMARY PRIMARY 4 tbl.artist.id 2 100.00 Using index
EXPLAIN EXTENDED SELECT collection.id AS 'i' FROM collection INNER JOIN artist_collection ON collection.id=artist_collection.collection_id LIMIT 100;
id select_type table type possible_keys key key_len ref rows filtered Extra
1 SIMPLE collection ALL NULL NULL NULL NULL 101 100.00
1 SIMPLE artist_collection index NULL PRIMARY 8 NULL 8725465 100.00 Using where; Using index; Using join buffer
Как вы можете видеть, это не обрабатывает запросы одинаково. Затем я побежал:
ALTER TABLE artist_collection DROP PRIMARY KEY;
ALTER TABLE artist_collection ADD PRIMARY KEY (collection_id,artist_id);
Это вызвало проблему переломить себя, где сейчас художник РЕГИСТРИРУЙТЕСЬ принимает очень долго. Поэтому мои вопросы таковы:
1) Разве MySQL интерпретирует первую и вторую записи PRIMARY KEY по-разному?
2) Что именно происходит?
3) Как сделать запросы одинаковыми (быстрыми)?