MySQL:为什么索引列标记为" BTREE?"

时间:2013-02-11 14:57:12

标签: mysql

让我们看两个表:

    CREATE TABLE  `orders_products` (
  `ORDER_ID` int(10) unsigned NOT NULL,
  `PRODUCT_ID` int(10) unsigned NOT NULL,
  `QUANTITY` tinyint(3) unsigned NOT NULL,
  `USER_ID` int(10) unsigned NOT NULL,
  PRIMARY KEY (`ORDER_ID`,`PRODUCT_ID`,`USER_ID`) USING BTREE,
  KEY `FK_orders_products_3` (`USER_ID`),
  KEY `FK_orders_products_2` (`PRODUCT_ID`) **USING BTREE**,
  CONSTRAINT `FK_orders_products_1` FOREIGN KEY (`ORDER_ID`) REFERENCES `orders` (`ID`) ON DELETE CASCADE,
  CONSTRAINT `FK_orders_products_2` FOREIGN KEY (`PRODUCT_ID`) REFERENCES `products` (`ID`) ON DELETE CASCADE,
  CONSTRAINT `FK_orders_products_3` FOREIGN KEY (`USER_ID`) REFERENCES `users` (`ID`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

另一:

CREATE TABLE  `products_pictures_comments` (
  `PICTURE_ID` int(10) unsigned NOT NULL,
  `USER_ID` int(10) unsigned NOT NULL,
  `COMMENT` text NOT NULL,
  `DATEAT` datetime NOT NULL,
  PRIMARY KEY (`PICTURE_ID`,`USER_ID`,`DATEAT`),
  KEY `FK_products_pictures_comments_2` (`USER_ID`),
  CONSTRAINT `FK_products_pictures_comments_1` FOREIGN KEY (`PICTURE_ID`) REFERENCES `products_pictures` (`ID`) ON DELETE CASCADE ON UPDATE CASCADE,
  CONSTRAINT `FK_products_pictures_comments_2` FOREIGN KEY (`USER_ID`) REFERENCES `users` (`ID`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

如您所见,USING BTREE出现的原因不明。我用show index from命令检查了表,并且所有这些都表示BTREE为Index_type。但它只出现在FK_orders_products_2外键中。为什么呢?

编辑:这些表定义由SHOW CREATE TABLE生成!

3 个答案:

答案 0 :(得分:1)

首先,我想提一下BTREE是MYSQL中大多数存储引擎的默认索引类型。我可以看到你正在使用带有两个语句的InnoDB存储引擎,而BTREE是innodb存储引擎中索引的默认类型,尽管你没有指定关键字。

我很确定你可能会保留"使用BTREE"创建表orders_products表时的关键字结果"使用BTREE"包含在由SHOW CREATE TABLE生成的DDL脚本中。

--------------实验--------------

DROP TABLE zzz_test1;

DROP TABLE zzz_test2;

CREATE TABLE zzz_test1(id INT,NAME VARCHAR(50),PRIMARY KEY(id)USING BTREE);

CREATE TABLE zzz_test2(id INT,NAME VARCHAR(50),PRIMARY KEY(id));

SHOW CREATE TABLE zzz_test1;


------------ OUTPUT --------------

CREATE TABLE zzz_test1(   id INT(11)NOT NULL DEFAULT' 0',   name VARCHAR(50)DEFAULT NULL,   PRIMARY KEY(id)使用BTREE )ENGINE = INNODB DEFAULT CHARSET = latin1


SHOW CREATE TABLE zzz_test2;

------------ OUTPUT --------------

CREATE TABLE zzz_test2(   id INT(11)NOT NULL DEFAULT' 0',   NAME VARCHAR(50)DEFAULT NULL,   主要关键(id) )ENGINE = INNODB DEFAULT CHARSET = latin1

答案 1 :(得分:0)

因为btree(假设它意味着平衡而不仅仅是二进制)是一种用于维护索引的有效数据结构。

它具有合理的插入和删除特性以及非常良好的搜索特性。

如果你的问题更多的是为什么它没有在任何地方使用,那几乎可以肯定,因为它使用其他方法。

答案 2 :(得分:0)

嗯,这是正常的,索引存储在Hash和btree中。我认为BTREE是用于在旧MySQL中实现索引的数据结构。但InnoDB引擎有一种新的自适应散列技术,它使用Hash表进行索引,使其更快。那里没有错。