CSNotesCSNotes
TODO
LeetCode
数据结构
计算机组成原理
操作系统
计算机网络
数据库
Java
SSM
React
实用工具
GitHub
TODO
LeetCode
数据结构
计算机组成原理
操作系统
计算机网络
数据库
Java
SSM
React
实用工具
GitHub
  • 第一章 SQL语法

    • 1.1 数据库
    • 1.2 MySQL 语法
    • 1.3 查询
    • 1.4 什么是 join?
    • 1.5 LIKE 操作符
    • 1.6 分组
    • 1.7 字段都有哪些属性
  • 第二章 了解 SQL

    • 2.1 数据库基础
    • 2.2 数据库范式
    • 2.3 字符集
    • 2.4 数据库概念
    • 2.5 最大行大小
  • 第三章 数据库概念

    • 3.1 一条 SQL 语句是如何执行的?
    • 3.2 InnoDB 行格式
    • 3.3 为什么数据库 VARCHAR 字段上限是 16383?
  • 第四章 数据库数据结构

    • 4.1 数据库数据结构
  • 第五章 索引

    • 5.1 索引
    • 5.2 一个 B+ 树中大概能存放多少条索引记录?
  • 第六章 范式

    • 6.1 范式
  • 第七章 日志

    • 7.1 日志
  • 第八章 事务

    • 8.1 事务简介
    • 8.2 事务
  • 第九章 InnoDB 页

    • 9.1 InnoDB 页
  • 第十章 常见面试题

    • 10.1 数据库存储索引为什么不用二叉排序树,不用红黑树,而用 B+ 树?
    • 10.2 为什么 InnoDB 中 B+ 树一个结点的页设置为 16KB
    • 索引失效

索引失效

隐式转换

什么是隐式转换?

image-20250528204529485
image-20250528204529485
image-20250528204624873
image-20250528204624873

运行 select '10'>9;返回 1

运行 select '10'>'9';返回 0

这就是隐式转换规则,对于不同类型的值比较,会把字符串转换为数字

create table db.test(
id BIGINT auto_increment PRIMARY key,
name varchar(30),
create_time TIMESTAMP(6),
update_time TIMESTAMP(6) on UPDATE CURRENT_TIMESTAMP(6)
);
create index idx_name on db.test(name);
image-20250528215731506
image-20250528215731506

select * from test where name = 1 不走索引

image-20250528215818353
image-20250528215818353

select * from test where name = '1' 走索引

等价于 select * from test where name = cast('1' as signed int);

这是因为 mysql 在遇到字符串和数字比较时,会把字符串转换为数字。

select * from test where name = 1; 等价于 select * from test where cast(name as signed int)=1;

对索引使用函数

image-20250528230857671
image-20250528230857671

select * from test where length(name)=2;

对索引使用函数不走索引。

因为索引保存的是索引字段的原始值,而不是经过函数计算后的值。

WHERE 子句中的 OR

image-20250528234532318
image-20250528234532318

因为 OR 的含义是两个条件满足一个即可,所以只有一个条件列是索引列是没意义的

编辑此页
上次更新: 2025/5/29 00:06
Prev
10.2 为什么 InnoDB 中 B+ 树一个结点的页设置为 16KB