2

让我们看两个表:

    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,所有表格都说 Index_type 的 BTREE。但它只出现在 FK_orders_products_2 外键中。为什么?

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

4

3 回答 3

3

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

我很确定您可能在创建表 orders_products 表时保留了“USING BTREE”关键字,该表导致“使用 BTREE”包含在由 SHOW CREATE TABLE 生成的 DDL 脚本中。

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

删除表 zzz_test1;

删除表 zzz_test2;

创建表 zzz_test1(id INT, NAME VARCHAR(50), PRIMARY KEY(id) USING BTREE);

创建表 zzz_test2(id INT, NAME VARCHAR(50), PRIMARY KEY(id));

显示创建表 zzz_test1;


- - - - - - 输出 - - - - - - -

创建表zzz_test1( idINT(11) NOT NULL DEFAULT '0', nameVARCHAR(50) DEFAULT NULL, PRIMARY KEY ( id) USING BTREE) ENGINE=INNODB DEFAULT CHARSET=latin1


显示创建表 zzz_test2;

- - - - - - 输出 - - - - - - -

CREATE TABLE zzz_test2( idINT(11) NOT NULL DEFAULT '0', NAMEVARCHAR(50) DEFAULT NULL, PRIMARY KEY ( id)) ENGINE=INNODB DEFAULT CHARSET=latin1

于 2014-05-18T10:53:24.337 回答
0

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

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

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

于 2013-02-11T15:05:17.910 回答
0

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

于 2013-02-11T15:09:25.323 回答