主键 Primary Key
主键是对某一条记录的唯一标识 主键唯一,且一张表只能有一个主键 主键不能为空,可以是联合主键
唯一键Unique Key
保证某个键的值不能重复(不是主键) 主键主要用于唯一标识记录;唯一键用于保证业务字段唯一 … 展开阅读
关于SQL索引
主键是对某一条记录的唯一标识 主键唯一,且一张表只能有一个主键 主键不能为空,可以是联合主键
保证某个键的值不能重复(不是主键) 主键主要用于唯一标识记录;唯一键用于保证业务字段唯一 … 展开阅读
主键是对某一条记录的唯一标识 主键唯一,且一张表只能有一个主键 主键不能为空,可以是联合主键
保证某个键的值不能重复(不是主键) 主键主要用于唯一标识记录;唯一键用于保证业务字段唯一。 唯一建可以为NULL
索引主要是为了提高查询速度,不唯一
表示表和表之间的关联关系 一个表中的字段引用另一个表的主键或唯一键,用来保证两个表之间的数据关系合法。
主要用于文本搜索
查询优化器: MySQL 一条 SQL,查询优化器负责分析这条 SQL,然后选择一个它认为执行成本更低的执行方案。 收起
关于SQL索引
索引是帮助SQL高效获取数据的有序数据结构
利用索引可以提高数据检索的效率,降低io成本
通过索引对数据进行排序,减少cpu消耗
索引占一部分空间
索引降低了更新表的速度,对表进行插入删除的时候成本提高
索引是帮助SQL高效获取数据的有序数据结构
利用索引可以提高数据检索的效率,降低io成本
通过索引对数据进行排序,减少cpu消耗
索引占一部分空间
索引降低了更新表的速度,对表进行插入删除的时候成本提高
InnoDB MYISAM Memory
Q:为什么用B+树不用二叉树,红黑树,B树
A:顺序查找会形成单向链表,性能大大降低,每个节点最多只能存两个子节点,大数据量情况下检索效率低,红黑树在大数据量情况下检索效率也没有提高。而B树无论是叶子节点还是非叶子节点都要保存数据和指针,这样导致一层中能够保存的建值变少,指针跟着减少,要保存大量数据只能增加树的高度,导致性能降低
非叶子节点为索引,叶子节点存放数据,叶子节点是单向链表
MYSQL的B+树对B+树进行优化,叶子节点形成了双向链表
InnoDB索引类型:
InnoDB
│
┌─────────┴─────────┐
↓ ↓
聚簇索引 二级索引
│ │
通常就是主键索引 name / age / email...
│ │
↓ ↓
整行数据 主键值
二级索引要回表查询,具体过程类似下图:
查询 name
↓
二级索引 B+Tree
↓
找到主键 id
↓
┌──────┴──────┐
↓ ↓
需要其他字段 不需要其他字段
↓ ↓
回表 直接返回
↓
聚簇索引 B+Tree
↓
完整数据
如果一张表存在主建,主键索引就是聚集索引 如果不存在主键,那么第一个索引UNIQUE为聚集索引 如果不存在主键也没有合适的索引,那么自动生成一个隐藏的rowid作为索引
除了上文提到了建立在一个列上的单列索引,有时候会将多个字段组合建立联合索引 使用联合索引的时候,遵循最左匹配原则 也就是说,会先比较在左边的索引,在符合范围的数据内,匹配右边的索引 在这种情况下如果只依靠右边索引查询效率会变低
有一类特殊情况,并不是查询过程使用了联合查询,就代表联合索引中的所有字段都用到了联合查询。这种特殊情况发生在范围查询。范围查询的字段可以使用联合索引,但是在范围查询后面的字段无法使用联合索引,因为范围查询之后的数据不保证有序,此时索引存在的意义不大,只能通过遍历比较这一部分数据来查询匹配项。
关于SQL日志
在执行完一条更新操作之后,server会生成一条binlog,等之后事务提交的时候,将本次事务中生成的所有binlog写入binlog日志。这个日志所有存储引擎都可以用。而且binlog是追加写,不会覆盖以前的日志。 binlog主要有三种格式:Statment,Row,Mixed,现在默认ROW
在事务提交之前,会先将要回退的操作记录在undolog之中。以便事务失败的回滚
redolog和undolog的区别是,redolog记录的是内存偏移量的操作。redolog记录了对哪个物理页做了什么修改,对XX表中的YY物理页ZZ偏移做了AA更新。事务提交的时候,redolog被持久化到磁盘,这个时候断电,虽然数据还没有被持久化到磁盘,但是物理页的偏移已经被记录,可以通过redolog恢复。 对redolog的操作是追加写,相比较磁盘的随机写,提高了执行性能。综上所述,redolog实际实现了: