暂无图片
请问mysql中索引是否带USING BTREE是什么区别?
我来答
分享
yueli34
2024-07-08
请问mysql中索引是否带USING BTREE是什么区别?

show create table;
| tb_emp | CREATE TABLE `tb_emp` (
`empno` int unsigned NOT NULL,
`ename` varchar(10) CHARACTER SET utf8mb3 COLLATE utf8_general_ci DEFAULT NULL,
`job` varchar(9) CHARACTER SET utf8mb3 COLLATE utf8_general_ci DEFAULT NULL,
`mgr` int unsigned DEFAULT NULL,
`hiredate` date DEFAULT NULL,
`sal` decimal(7,2) DEFAULT NULL,
`comm` decimal(7,2) DEFAULT NULL,
`deptno` tinyint unsigned DEFAULT NULL,
PRIMARY KEY (`empno`) USING BTREE,
KEY `deptno` (`deptno`) USING BTREE,
KEY `ind_sal` (`sal`),
CONSTRAINT `tb_emp_ibfk_1` FOREIGN KEY (`deptno`) REFERENCES `tb_dept` (`deptno`) ON DELETE RESTRICT ON UPDATE RESTRICT
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 ROW_FORMAT=DYNAMIC |


3个索引如下:两个带using btree一个不带using btree,

PRIMARY KEY (`empno`) USING BTREE,
KEY `deptno` (`deptno`) USING BTREE,

KEY `ind_sal` (`sal`)

请问是什么区别?谢谢!

是否有类似show create table的语句查看create索引的语句?

我来答
添加附件
收藏
分享
问题补充
1条回答
默认
最新
龙镇君

在MySQL中,索引(Index)是用于帮助MySQL高效获取数据的数据结构。MySQL支持多种类型的索引,包括B-Tree索引、哈希索引、全文索引等。当你创建一个索引时,你可以指定索引的类型,但通常情况下,如果不明确指定索引类型,MySQL将默认使用B-Tree索引,因为它适用于大多数情况。

关于USING BTREE的说明:

  • USING BTREE:这个选项明确指定了索引应该使用B-Tree(平衡树)数据结构来创建。B-Tree索引是MySQL中最常用的索引类型,因为它适用于全键值、键值范围或键值前缀查找。B-Tree索引也支持排序,所以它们也常用于ORDER BY和GROUP BY子句的优化。

  • 不带USING子句:如果不带USING子句创建索引,MySQL将默认使用B-Tree索引,因为B-Tree索引在大多数情况下都是最优选择。但是,如果你正在使用支持哈希索引的存储引擎(如MEMORY/HEAP),并且你想要一个哈希索引而不是B-Tree索引,你需要在创建索引时明确指定USING HASH

  • 其他索引类型:虽然B-Tree索引是MySQL中最常用的索引类型,但还有其他类型的索引,如哈希索引(USING HASH)、全文索引(FULLTEXT,不直接通过USING子句指定,但有自己的语法)和空间索引(SPATIAL,也是通过特定的语法而不是USING子句来指定)。

区别

  • 明确性:使用USING BTREE可以明确你的意图,即你想要一个B-Tree索引。虽然这在大多数情况下是多余的,但在某些情况下,它可能有助于文档化或强调索引的特定类型。

  • 灵活性:如果你需要不同类型的索引(如哈希索引),你需要明确指定USING HASH。不指定USING子句将不会得到你想要的哈希索引,除非你在支持哈希索引的存储引擎上操作,并且MySQL的默认行为符合你的需求。

  • 默认行为:在大多数情况下,不指定USING子句和指定USING BTREE的效果是相同的,因为MySQL默认使用B-Tree索引。但是,了解这种默认行为以及如何通过USING子句来覆盖它,对于深入理解MySQL索引和优化查询性能是很有帮助的。

暂无图片 评论
暂无图片 有用 0
打赏 0
回答交流
Markdown


请输入正文
提交
相关推荐
MySQL merge 外面可以套insert吗?
回答 2
不可以
以下描述中对mysql里mgr描述正确的有哪些?
回答 1
已采纳
A基于分布式Paxos的xcom协议实现组复制,保证数据一致性CMGR组件里包含Capture,Apply,recovery,GCSAPI,API,CommunicationEngineDXCOM是单
MySQL a表拼接字段怎么更新到b表?
回答 2
问题表述模糊不清。updateajoinbona.idb.idsetb.colnameconcat(a.colname,a.colname2)
mysql如何实现oracle的instr功能,可以指定开始检索的位置?
回答 2
mysql支持instr函数,和oracle上的instr用法一样
MySQL 存储过程执行不结束,一直执行,逻辑都走完了,但是不停,是什么原因?
回答 6
打个断点,输出调式信息,逐步调试。。。。
MySQL数据库内存升高问题
回答 3
A
linux下忘记root密码的修改方法失败,但是再windows下可以成功,请问咋回事?
回答 1
my.inf中添加skipgranttables,重新启动来重置密码,改好以后要把这个去掉。
show relaylog events in '';语里面句被#注释什么意思
回答 2
如果是报主键冲突,可以用在my.cnf里添加slaveskiperrors参数,过滤掉主键冲突的错误,或者将slave中冲突的记录删除即可
MYSQL的MGR集群从节点加入在未更新数据正常,但是主节点更新数据后RECOVERING状态。
回答 3
日志说是slave没有school数据库,导致SQL应用进程异常。
如何确定一个事务是否已经落盘
回答 2
已采纳
<aid"SHOWENGINEINNODBSTATUSGlog0"SHOWENGINEINNODBSTATUS\G中的log部分LOGLogsequencenumber74132299Logbuffe