连接数据库
mysql -h 主机地址 -P 端口号 -u用户名 -p用户密码- 或者
mysql -h 主机地址 -P 端口号 -u用户名 -p随后输入密码
LIKE 关键字 | 模糊查询
- 用法:
%(任意数量字符)和_(单个字符)两种通配符,不支持[]语法 - RLIKE、REGEXP:支持复杂的正则表达式,性能差
- 模糊搜索建议使用 ELK(倒排索引) 或者创建 全文索引
- 数据库模糊检索与索引之间的联系:
- 传统B-tree索引对精确匹配或前缀匹配(如
LIKE 'abc%')效率很高 - 但对通用的模糊匹配(如
LIKE '%abc%')效率显著下降 - 通配符开头的模式(
%abc)使索引失效 - 中间包含通配符的模式(
a%c)也难以利用索引
- 传统B-tree索引对精确匹配或前缀匹配(如
LIMIT 关键字 | 分页
- 基本用法:
LIMIT [offset,] row_count|LIMIT page_size OFFSET offset; - 第一个参数是偏移量(从0开始),第二个参数是要返回的行数
- 对于大数据表,大偏移量可能导致性能问题,可以考虑使用其他分页策略
DROP | DELETE | TRUNCATE 区别
- Delete: 删除表中的特定行数据(可带WHERE条件)
- 是DML(数据操作语言)命令
- 可以回滚(如果事务未提交)
- 会触发触发器
- 会记录日志(占用较多事务日志空间)
- 删除速度较慢(特别是大表)
- 不释放表空间(只是标记为可覆盖)
- DROP: 完全删除表(包括结构和数据)
- 是DDL命令
- 不可回滚
- 删除表结构、数据、索引、约束等所有内容
- 释放所有空间
- 需要重新创建表才能再次使用
- Truncate: 快速删除表中所有数据
- 是DDL(数据定义语言)命令
- 不可回滚(自动提交)
- 不触发触发器
- 记录最小日志(效率更高)
- 比DELETE快得多
- 重置自增列计数器
- 释放表空间(保留表结构)
连接
- inner join
- left join
- right join
事务
- 事务控制语句
1 2 3 4 5 6 7START TRANSACTION; -- 或 BEGIN,开始一个事务 COMMIT; -- 提交事务 ROLLBACK; -- 回滚事务 SAVEPOINT; -- 设置保存点 ROLLBACK TO SAVEPOINT; -- 回滚到保存点 RELEASE SAVEPOINT; -- 删除保存点 SET TRANSACTION; -- 设置事务的隔离级别 - 事务的四大特性-ACID
- 原子性 (Atomicity)
- 一致性 (Consistency)
- 隔离性 (Isolation)
- 持久性 (Durability)
- 事务隔离级别
- 读未提交(READ UNCOMMITTED)
- 最低隔离级别,允许读取未提交的数据变更
- 可能导致脏读、不可重复读和幻读
- 读已提交(READ COMMITTED)
- 允许读取并发事务已经提交的数据
- 可以阻止脏读,但不可重复读和幻读仍可能发生
- 可重复读(REPEATABLE READ) - MySQL 默认级别
- 对同一字段的多次读取结果都是一致的
- 可以阻止脏读和不可重复读,但幻读仍可能发生
- 串行化(SERIALIZABLE)
- 最高隔离级别,完全服从ACID
- 所有事务依次逐个执行
- 可以防止脏读、不可重复读和幻读
- 读未提交(READ UNCOMMITTED)
- 事务并发问题
- 脏读(Dirty Read)
- 一个事务读取了另一个未提交事务修改过的数据
- 不可重复读(Non-repeatable Read)
- 一个事务内多次读取同一数据,结果不同(因为其他事务修改了数据)
- 幻读(Phantom Read)
- 一个事务内多次查询,结果集的行数不同(因为其他事务插入了新数据)
- 脏读(Dirty Read)
索引
- 索引的类型
- 按数据结构分类
- B+Tree索引:MySQL最常用的索引类型,InnoDB和MyISAM引擎都支持
- Hash索引:Memory引擎支持,精确查询快,不支持范围查询
- Full-text索引:全文索引,MyISAM和InnoDB(5.6+)支持
- R-Tree索引:空间索引,MyISAM支持
- 按逻辑分类
- 普通索引:最基本的索引,没有任何限制
- 唯一索引:索引列的值必须唯一,允许有空值
- 主键索引:特殊的唯一索引,不允许有空值
- 组合索引:多个列组合创建的索引
- 全文索引:用于全文搜索
- 按数据结构分类
- 索引相关语法
- 创建索引:
1CREATE INDEX index_name ON table_name(column_name); - 创建唯一索引:
1CREATE UNIQUE INDEX index_name ON table_name(column_name); - 创建组合索引:
1CREATE INDEX index_name ON table_name(col1, col2, col3); - 删除索引:
1DROP INDEX index_name ON table_name; - 查看索引:
1SHOW INDEX FROM table_name;
- 创建索引:
- 索引的优缺点
- 优点:
- 大大加快数据检索速度
- 加速表之间的连接
- 减少分组和排序的时间
- 缺点:
- 占用额外的存储空间
- 降低数据写入速度(INSERT/UPDATE/DELETE需要维护索引)
- 优点:
- 主键与唯一索引的区别
- 唯一性
- 主键:每个表只能有一个主键
- 唯一索引:一个表可以有多个唯一索引
- NULL值
- 主键:不允许包含NULL值
- 唯一索引:可以包含NULL值(但只能有一个NULL值,因为NULL不等于NULL)
- 自动创建
- 主键:如果未显式定义主键,InnoDB会隐式创建一个6字节的主键
- 唯一索引:必须显式创建
- 聚集索引
- 主键:在InnoDB中,主键默认是聚集索引(数据按主键顺序存储)
- 唯一索引:是非聚集索引(除非没有主键且该唯一索引是第一个唯一索引)
- 外键引用
- 主键:可以被其他表的外键引用
- 唯一索引:也可以被外键引用,但不如主键常见
- 自动递增
- 主键:常与AUTO_INCREMENT一起使用
- 唯一索引:一般不使用AUTO_INCREMENT
- 唯一性
锁
日志
- Binary Log | binlog
- Redo log (Innodb)
- Undo log
- Error log
- Slow Query Log
- General Query Log
- Relay Log
约束
触发器
存储过程
视图
游标
三大范式
1NF:字段不可再分,原子性
2NF:消除非主属性对主键的部分函数依赖
3NF:消除非主属性对主键的传递函数依赖
TODO: 补充完成块内容
大小写问题
- 数据库和表名
- Linux/Unix系统:默认区分大小写
- Windows/Mac OS X:默认不区分大小写
- 列名
- 列名在所有平台上都不区分大小写
- 字符串值
- 取决于字符集
utf8_general_ci:不区分大小写(ci=case insensitive)utf8_bin:区分大小写(bin=binary)utf8_general_cs:区分大小写(cs=case sensitive)
- 取决于字符集
- 关键字和函数名
- 不区分