mam te małe stoliki, item
i category
:różnica mysql w użyciu indeksu MyISAM i InnoDB między
CREATE TABLE `item` (
`id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(150) NOT NULL,
`category_id` mediumint(8) unsigned NOT NULL,
PRIMARY KEY (`id`),
KEY `name` (`name`),
KEY `category_id` (`category_id`)
) CHARSET=utf8
CREATE TABLE `category` (
`id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(150) NOT NULL,
PRIMARY KEY (`id`),
KEY `name` (`name`)
) CHARSET=utf8
mam wstawione 100 kategorie i 1000 elementów.
Jeśli uruchomię to:
EXPLAIN SELECT item.id,category.name AS category_name FROM item JOIN category ON item.category_id=category.id;
Następnie, jeśli silnik tabelach jest InnoDB uzyskać:
+----+-------------+----------+-------+---------------+-------------+---------+--------------------+------+-------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+----------+-------+---------------+-------------+---------+--------------------+------+-------------+
| 1 | SIMPLE | category | index | PRIMARY | name | 452 | NULL | 103 | Using index |
| 1 | SIMPLE | item | ref | category_id | category_id | 3 | dbname.category.id | 5 | Using index |
+----+-------------+----------+-------+---------------+-------------+---------+--------------------+------+-------------+
Natomiast jeśli przełączyć do MyISAM (z alter table engine=myisam
) uzyskać:
+----+-------------+----------+--------+---------------+---------+---------+-------------------------+------+-------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+----------+--------+---------------+---------+---------+-------------------------+------+-------+
| 1 | SIMPLE | item | ALL | category_id | NULL | NULL | NULL | 1003 | |
| 1 | SIMPLE | category | eq_ref | PRIMARY | PRIMARY | 3 | dbname.item.category_id | 1 | |
+----+-------------+----------+--------+---------------+---------+---------+-------------------------+------+-------+
Moje pytanie brzmi, dlaczego ta różnica w sposobie obsługi indeksów?
jesteś pewien, że nie musisz także odbudowywać indeksów po zmianie silnika? – Sebas
zgodnie z http://dev.mysql.com/doc/refman/5.0/en/rebuilding-tables.html, 'alter table engine' jest sposobem na przebudowanie go. Niemniej jednak próbowałem wyrzucać i ponownie importować tabele, a wynik był taki sam (dla myisam). – periklis