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

标签 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 命令检查了表,所有的 Index_type 都显示为 BTREE。但它只出现在 FK_orders_products_2 外键中。为什么?

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

最佳答案

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

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

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

删除表 zzz_test1;

删除表 zzz_test2;

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

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

显示创建表 zzz_test1;


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

创建表zzz_test1 ( id INT(11) NOT NULL DEFAULT '0', 名称 VARCHAR(50) 默认为 NULL, 使用 BTREE 的主键 (id) ) ENGINE=INNODB 默认字符集=latin1


显示创建表 zzz_test2;

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

创建表zzz_test2 ( id INT(11) NOT NULL DEFAULT '0', NAME VARCHAR(50) 默认为 NULL, 主键(id) ) ENGINE=INNODB 默认字符集=latin1

关于MySQL:为什么索引列标记为 "BTREE?",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14814650/

相关文章:

mysql - 一级索引与二级索引 : performance differences

mysql - 通过另一个盒子(通过 ssh?)从 rails 连接到 protected RDS(MySQL)实例

Mysql2::Error Access denied for user 'root' @'localhost' (using password: NO) ruby​​ on rails

mysql - 找不到这个 MySQL 事件语法有什么问题

mysql - 如果执行 MySQL LOCK TABLES 表的脚本在解锁之前死亡,该怎么办?

android - ListView 每页仅显示一个数据

mysql - 如何使用 SQL 查询获取该表单的数据

php - mysql 获取名字的id

php - 数据库中的插入值是 0,即使它不应该是

php - 根据表中的不同值对列进行查询