tôi có các bảng nhỏ, item
và category
:khác biệt mysql trong việc sử dụng chỉ số giữa MyISAM và InnoDB
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
Tôi đã chèn 100 loại và 1000 mặt hàng.
Nếu tôi chạy này:
EXPLAIN SELECT item.id,category.name AS category_name FROM item JOIN category ON item.category_id=category.id;
Sau đó, nếu động cơ của bảng là InnoDB tôi nhận được:
+----+-------------+----------+-------+---------------+-------------+---------+--------------------+------+-------------+
| 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 |
+----+-------------+----------+-------+---------------+-------------+---------+--------------------+------+-------------+
Trong khi đó, nếu tôi chuyển sang MyISAM (với alter table engine=myisam
) tôi nhận được:
+----+-------------+----------+--------+---------------+---------+---------+-------------------------+------+-------+
| 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 | |
+----+-------------+----------+--------+---------------+---------+---------+-------------------------+------+-------+
Câu hỏi của tôi là, tại sao sự khác biệt này trong cách chỉ mục được xử lý?
bạn có chắc chắn bạn không phải xây dựng lại các chỉ số sau công cụ thay đổi không? – Sebas
theo http://dev.mysql.com/doc/refman/5.0/en/rebuilding-tables.html, 'thay đổi công cụ bảng' là một cách để xây dựng lại nó. Tuy nhiên, tôi đã cố gắng bán phá giá và reimporting bảng, và kết quả là như nhau (đối với myisam) – periklis