鍍金池/ 問答/數(shù)據(jù)庫/ MySQL innodb和myisam 使用主鍵排序的疑問

MySQL innodb和myisam 使用主鍵排序的疑問

rental表的存儲(chǔ)引擎是innodb, rental_myisam表的存儲(chǔ)引擎是myisam。兩張表除存儲(chǔ)引擎不同外,表結(jié)構(gòu)都一樣。

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分析,發(fā)現(xiàn) rental表 使用了主鍵索引排序,而 rental_myisam表 卻并沒有用到主鍵索引排序,反而extra里用到"文件排序",不太懂為啥會(huì)是這樣的區(qū)別?

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

回答
編輯回答
旖襯

innodb引擎的所有儲(chǔ)存了主鍵ID,事務(wù)ID,回滾指針,非主鍵ID,
他的查詢就會(huì)是非主鍵ID也可覆蓋來取得主鍵ID。

也就是說比如你在created_at上建立索引,此時(shí)主鍵也是在索引上的。不然你可以試試以下語句

explain select id from tablea where created_at = 1
2018年8月21日 07:58
編輯回答
單眼皮

MyISAM是非聚簇索引,葉子節(jié)點(diǎn)上存儲(chǔ)的物理空間地址,而物理空間地址是混亂無序的,MyISAM只能先取數(shù)據(jù),再排序

InnoDB是聚簇索引,葉子節(jié)點(diǎn)是雙向鏈表,也就是物理存放順序和索引順序一致,在沿著雙向鏈表取數(shù)據(jù)的同時(shí),完成了ORDER BY PRIMARY排序工作

2017年10月5日 23:47