让我们看两个表:
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生成!
答案 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表进行索引,使其更快。那里没有错。