主键是一种唯一索引,但他必须制定为PRIMARY KEY ,每个表只能有一个主键(一个主键指的不是一个列 也可能有多个列联合主键)
其实主键没有的话 数据库会根据唯一键 建立索引
如果唯一键也没有 数据库会自动生成一个不可见的row_id作为记录唯一标示建立索引
自增主键:是通过一个自增锁来实现的 如果新增失败 就会少几个值
没有特殊需求 可以用自增主键: 减少页的分裂 &合并
索引列的所有值 只能出现一次 既必须唯一 值可以是空
唯一索引不用回表
基本的索引类型,值可以为空,没有唯一索引的限制(覆盖索引)
查找数据需要回表
覆盖索引:直接从普通索引中获取到id 不用回表 就叫覆盖索引
sleect * from table where age = 10 用不到这个索引 这就是最左匹配原则
select *from table where name = ‘大傻子’ 这样就可以匹配到name_id组合索引
如果程序中sql都是 where name=xxx and age = xxx 和 where age = xxx
可以建立一个组合索引 把age放前边 age_name 组合索引
这样的话 age 可以匹配到 name age 也可以匹配到
3. 表
需求:
a. where age=xx and name=xx
b. where age = xx
c. where name = xx
怎么建索引?
1. age_name name 2. name_age age
选用第二种 因为age_name 与 name_age 索引占用空间差不多
但是name 比 age 占用的空间要大不少
在空间层面考虑的话 第二种合适
回表 覆盖索引 最左前缀 上边学了
啥是索引下推呢 ?
索引下推的最终目的就是减少回表数据
比如 查找用户的时候 按照名称和年龄查找
select * from table where name like '%智障%' and age = 18 and height = 180
没有下推的过程是这样子的:
1. 匹配到了大智障 和 小智障 根据id 11和 12 进行回表操作 去看height是否符合条件
下推之后是这样的:
age在回表前先过滤一次 剩下一条记录需要回表了
索引类型 | 支持事物 | 支持表锁 | 支持行锁 | 支持外键 | 支持全文索引 | 适合操作 |
---|---|---|---|---|---|---|
MyISAM | 否 | 是 | 否 | 否 | 是 | 大量select |
Innodb | 是 | 是 | 是 | 是 | 是(5.6之后) | 大量insert delete update |