白桃乌龙的MySQL笔记

记录在MySQL上遇到的问题常用命令以及相关知识点

连接数据库

  • mysql -h 主机地址 -P 端口号 -u用户名 -p用户密码
  • 或者 mysql -h 主机地址 -P 端口号 -u用户名 -p 随后输入密码

LIKE 关键字 | 模糊查询

  • 用法%(任意数量字符)和 _(单个字符)两种通配符,不支持[]语法
  • RLIKEREGEXP:支持复杂的正则表达式,性能差
  • 模糊搜索建议使用 ELK(倒排索引) 或者创建 全文索引
  • 数据库模糊检索与索引之间的联系:
    • 传统B-tree索引对精确匹配或前缀匹配(如LIKE 'abc%')效率很高
    • 但对通用的模糊匹配(如LIKE '%abc%')效率显著下降
    • 通配符开头的模式(%abc)使索引失效
    • 中间包含通配符的模式(a%c)也难以利用索引

LIMIT 关键字 | 分页

  • 基本用法LIMIT [offset,] row_count | LIMIT page_size OFFSET offset;
  • 第一个参数是偏移量(从0开始),第二个参数是要返回的行数
  • 对于大数据表,大偏移量可能导致性能问题,可以考虑使用其他分页策略

DROP | DELETE | TRUNCATE 区别

  1. Delete: 删除表中的特定行数据(可带WHERE条件)
    • 是DML(数据操作语言)命令
    • 可以回滚(如果事务未提交)
    • 会触发触发器
    • 会记录日志(占用较多事务日志空间)
    • 删除速度较慢(特别是大表)
    • 不释放表空间(只是标记为可覆盖)
  2. DROP: 完全删除表(包括结构和数据)
    • 是DDL命令
    • 不可回滚
    • 删除表结构、数据、索引、约束等所有内容
    • 释放所有空间
    • 需要重新创建表才能再次使用
  3. Truncate: 快速删除表中所有数据
    • 是DDL(数据定义语言)命令
    • 不可回滚(自动提交)
    • 不触发触发器
    • 记录最小日志(效率更高)
    • 比DELETE快得多
    • 重置自增列计数器
    • 释放表空间(保留表结构)

连接

  1. inner join
  2. left join
  3. right join

事务

  1. 事务控制语句
    1
    2
    3
    4
    5
    6
    7
    
    START TRANSACTION;  -- 或 BEGIN,开始一个事务
    COMMIT;             -- 提交事务
    ROLLBACK;           -- 回滚事务
    SAVEPOINT;          -- 设置保存点
    ROLLBACK TO SAVEPOINT; -- 回滚到保存点
    RELEASE SAVEPOINT;  -- 删除保存点
    SET TRANSACTION;    -- 设置事务的隔离级别
    
  2. 事务的四大特性-ACID
    1. 原子性 (Atomicity)
    2. 一致性 (Consistency)
    3. 隔离性 (Isolation)
    4. 持久性 (Durability)
  3. 事务隔离级别
    1. 读未提交(READ UNCOMMITTED)
      • 最低隔离级别,允许读取未提交的数据变更
      • 可能导致脏读、不可重复读和幻读
    2. 读已提交(READ COMMITTED)
      • 允许读取并发事务已经提交的数据
      • 可以阻止脏读,但不可重复读和幻读仍可能发生
    3. 可重复读(REPEATABLE READ) - MySQL 默认级别
      • 对同一字段的多次读取结果都是一致的
      • 可以阻止脏读和不可重复读,但幻读仍可能发生
    4. 串行化(SERIALIZABLE)
      • 最高隔离级别,完全服从ACID
      • 所有事务依次逐个执行
      • 可以防止脏读、不可重复读和幻读
  4. 事务并发问题
    1. 脏读(Dirty Read)
      • 一个事务读取了另一个未提交事务修改过的数据
    2. 不可重复读(Non-repeatable Read)
      • 一个事务内多次读取同一数据,结果不同(因为其他事务修改了数据)
    3. 幻读(Phantom Read)
      • 一个事务内多次查询,结果集的行数不同(因为其他事务插入了新数据)

索引

  • 索引的类型
    1. 按数据结构分类
      • B+Tree索引:MySQL最常用的索引类型,InnoDB和MyISAM引擎都支持
      • Hash索引:Memory引擎支持,精确查询快,不支持范围查询
      • Full-text索引:全文索引,MyISAM和InnoDB(5.6+)支持
      • R-Tree索引:空间索引,MyISAM支持
    2. 按逻辑分类
      • 普通索引:最基本的索引,没有任何限制
      • 唯一索引:索引列的值必须唯一,允许有空值
      • 主键索引:特殊的唯一索引,不允许有空值
      • 组合索引:多个列组合创建的索引
      • 全文索引:用于全文搜索
  • 索引相关语法
    • 创建索引:
      1
      
      CREATE INDEX index_name ON table_name(column_name); 
      
    • 创建唯一索引:
      1
      
      CREATE UNIQUE INDEX index_name ON table_name(column_name); 
      
    • 创建组合索引:
      1
      
       CREATE INDEX index_name ON table_name(col1, col2, col3); 
      
    • 删除索引:
      1
      
      DROP INDEX index_name ON table_name;
      
    • 查看索引:
      1
      
      SHOW INDEX FROM table_name;
      
  • 索引的优缺点
    • 优点
      • 大大加快数据检索速度
      • 加速表之间的连接
      • 减少分组和排序的时间
    • 缺点
      • 占用额外的存储空间
      • 降低数据写入速度(INSERT/UPDATE/DELETE需要维护索引)
  • 主键与唯一索引的区别
    1. 唯一性
      • 主键:每个表只能有一个主键
      • 唯一索引:一个表可以有多个唯一索引
    2. NULL值
      • 主键:不允许包含NULL值
      • 唯一索引:可以包含NULL值(但只能有一个NULL值,因为NULL不等于NULL)
    3. 自动创建
      • 主键:如果未显式定义主键,InnoDB会隐式创建一个6字节的主键
      • 唯一索引:必须显式创建
    4. 聚集索引
      • 主键:在InnoDB中,主键默认是聚集索引(数据按主键顺序存储)
      • 唯一索引:是非聚集索引(除非没有主键且该唯一索引是第一个唯一索引)
    5. 外键引用
      • 主键:可以被其他表的外键引用
      • 唯一索引:也可以被外键引用,但不如主键常见
    6. 自动递增
      • 主键:常与AUTO_INCREMENT一起使用
      • 唯一索引:一般不使用AUTO_INCREMENT

日志

  1. Binary Log | binlog
  2. Redo log (Innodb)
  3. Undo log
  4. Error log
  5. Slow Query Log
  6. General Query Log
  7. Relay Log

约束

触发器

存储过程

视图

游标

三大范式

  1. 1NF:字段不可再分,原子性

  2. 2NF:消除非主属性对主键的部分函数依赖

  3. 3NF:消除非主属性对主键的传递函数依赖

  4. TODO: 补充完成块内容

大小写问题

  1. 数据库和表名
    • Linux/Unix系统:默认区分大小写
    • Windows/Mac OS X:默认不区分大小写
  2. 列名
    • 列名在所有平台上都不区分大小写
  3. 字符串值
    • 取决于字符集
      • utf8_general_ci:不区分大小写(ci=case insensitive)
      • utf8_bin:区分大小写(bin=binary)
      • utf8_general_cs:区分大小写(cs=case sensitive)
  4. 关键字和函数名
    • 不区分

EXISTS和IN的区别

聚合函数和窗口函数的区别

Licensed under CC BY-NC-SA 4.0
最后更新于 Jun 21, 2025 00:00 UTC