Appearance
MySQL
1. CHAR 和 VARCHAR 的区别
CHAR 是固定长度的字符串类型,定义时需要指定固定长度,存储时会在末尾补足空格。
CHAR适合存储长度固定的数据,如固定长度的代码、状态等,存储空间固定,对于短字符串效率较高。
VARCHAR 是可变长度的字符串类型,定义时需要指定最大长度,实际存储时根据实际长度占用存储空间。
VARCHAR适合存储长度可变的数据,如用户输入的文本、备注等,节约存储空间。
2. TEXT数据类型可以无限大吗
- TEXT 65535 bytes (64Kb)
- MEDIUMTEXT 16777215 bytes (16Mb)
- LONGTEXT 4294967295 bytes (4Gb)
3. 主键和外键区别
主键是用于唯一标识表中每一行数据的字段,不允许为空且必须唯一。
定义主键时会自动创建唯一约束(UNIQUE Constraint)
外键是用于建立表之间关系的字段,它引用另一个表的主键,允许重复且可以为空,确保引用的完整性。
定义外键时会创建引用完整性约束,确保外键值必需在主表中存在。
4. IN 和 EXISTS
IN用于判断某个值是否在一个给定的集合中,集合可以是一个明确的列表或者是一个子查询的结果。
sql
SELECT * FROM table_name WHERE column_name IN (value1, value2, ...);特点:
IN适用于小型的子查询结果集IN语句的子查询会在执行之前先执行并缓存所有结果- 当子查询的结果集较小或明确指定列表时,
IN的性能通常较好 - 如果子查询返回的结果集较大,
IN可能会导致性能问题
EXISTS用于判断是否存在满足条件的记录,它通常结合子查询使用。当子查询返回至少一行数据时,EXISTS返回TRUE。
sql
SELECT * FROM table_name WHERE EXISTS (SELECT 1 FROM another_table WHERE condition);特点:
EXISTS子查询在遇到符合条件的第一条记录时就会停止执行,因此在处理大型数据集时可能比IN更高校。EXISTS常用语子查询返回大量数据且只需判断数据是否存在的场景。- 当子查询涉及复杂的计算或返回大量数据时,
EXISTS的性能通常优于IN。
二者区别:
使用场景:
IN适合用于子查询结果较小的情况,或者明确的值列表EXISTS更适合于判断子查询是否有记录返回的情况,尤其是子查询结果集较大时。
性能:
IN子查询会将所有结果集先缓存下来,这对小数据集是可以的,但对于大叔级性能较差。EXISTS子查询在找到第一个匹配结果时就停止执行,因此通常在大数据上比IN更高效。
执行逻辑:
IN是基于列表匹配的操作EXISTS是基于不二判断(是否存在)的操作。
5. SQL查询语句的执行顺序
FROM: 首先选择数据来源的表或视图,并进行链接(如果有多个表)。
JOIN: 执行表连接操作,合并符合连接条件的多表数据。
ON: 应用连接条件过滤连接的结果集合
WHERE: 对表中选取的记录进行过滤,仅保留满足WHERE条件的记录
GROUP BY: 将数据按指定的列进行分组,通常用于聚合操作。
HAVING: 对分组后的数据进行过滤,仅保留满足HAVING条件的分组。
SELECT: 选择并返回所需的列或表达式
DISTINCT: 在SELECT中去除重复的记录
ORDER BY: 对结果集进行排序。
LIMIT: 限制返回的记录数量。
6. 执行一条SQL请求的过程是什么
建立连接: 客户端向数据库服务器发送连接请求,连接器校验用户身份,建立连接。
检查查询缓存(MySQL8.0之前):检查查询语句是否在缓存中命中,如果命中则直接返回结果。
解析SQL:通过解析器对SQL语句进行词法分析、语法分析,构建语法树(用于后续的处理,如优化器读取表名、字段名和语句类型)。
预处理SQL: 会检查查询中所涉及的表、字段、权限等,确保他们存在并且用户有权限访问。对于SELECT查询,预处理阶段会扩展为表上的所有列。
优化SQL:生成多个执行计划,选择最右执行计划。(优化过程考虑了多种因素,例如索引的使用、数据表的大小、数据的分布等,确保查询能够以最快的方式执行)
执行SQL: 按照执行计划执行SQL语句,调用存储引擎接口,从存储中读取或写入数据。
返回结果:将查询结果返回给客户端。