MySQL innodb和myisam 使用主键排序的疑问

rental表的存储引擎是innodb, rental_myisam表的存储引擎是myisam。两张表除存储引擎不同外,表结构都一样。

CREATE TABLE `rental` (
  `rental_id` int(11) NOT NULL AUTO_INCREMENT,
  `rental_date` datetime NOT NULL,
  `inventory_id` mediumint(8) unsigned NOT NULL,
  `customer_id` smallint(5) unsigned NOT NULL,
  `return_date` datetime DEFAULT NULL,
  `staff_id` tinyint(3) unsigned NOT NULL,
  `last_update` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`rental_id`),
  KEY `rental_date` (`rental_date`,`inventory_id`,`customer_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

CREATE TABLE `rental_myisam` (
  `rental_id` int(11) NOT NULL AUTO_INCREMENT,
  `rental_date` datetime NOT NULL,
  `inventory_id` mediumint(8) unsigned NOT NULL,
  `customer_id` smallint(5) unsigned NOT NULL,
  `return_date` datetime DEFAULT NULL,
  `staff_id` tinyint(3) unsigned NOT NULL,
  `last_update` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`rental_id`),
  KEY `rental_date` (`rental_date`,`inventory_id`,`customer_id`)
) ENGINE=MyISAM AUTO_INCREMENT=16050 DEFAULT CHARSET=utf8;

使用explain分析,发现 rental表 使用了主键索引排序,而 rental_myisam表 却并没有用到主键索引排序,反而extra里用到"文件排序",不太懂为啥会是这样的区别?

explain select * from rental where return_date > '2005-08-30' order by rental_idG

clipboard.png

explain select * from rental_myisam where return_date > '2005-08-30' order by rental_idG

clipboard.png

阅读 3.5k
2 个回答

MyISAM是非聚簇索引,叶子节点上存储的物理空间地址,而物理空间地址是混乱无序的,MyISAM只能先取数据,再排序

InnoDB是聚簇索引,叶子节点是双向链表,也就是物理存放顺序和索引顺序一致,在沿着双向链表取数据的同时,完成了ORDER BY PRIMARY排序工作

innodb引擎的所有储存了主键ID,事务ID,回滚指针,非主键ID,
他的查询就会是非主键ID也可覆盖来取得主键ID。

也就是说比如你在created_at上建立索引,此时主键也是在索引上的。不然你可以试试以下语句

explain select id from tablea where created_at = 1
推荐问题