mysql优化 个人笔记 非礼勿扰 -m06

索引分类

1.主键索引

主键是一种唯一索引,但他必须制定为PRIMARY KEY ,每个表只能有一个主键(一个主键指的不是一个列 也可能有多个列联合主键)

其实主键没有的话 数据库会根据唯一键 建立索引
如果唯一键也没有 数据库会自动生成一个不可见的row_id作为记录唯一标示建立索引

自增主键:是通过一个自增锁来实现的 如果新增失败 就会少几个值
没有特殊需求 可以用自增主键: 减少页的分裂 &合并

2. 唯一索引

索引列的所有值 只能出现一次 既必须唯一 值可以是空
唯一索引不用回表

3. 普通索引

基本的索引类型,值可以为空,没有唯一索引的限制(覆盖索引)
查找数据需要回表
覆盖索引:直接从普通索引中获取到id 不用回表 就叫覆盖索引
在这里插入图片描述

全文索引

  1. 全文索引的索引类型为FULLTEXT
  2. 全文索引可以在varchar 、 char 、text类型的列上创建
  3. MyISAM支持 Innodb 在5.6之后支持
  4. 公司一般不用 都用程序支持Elasticsearch solor 等

组合索引

  1. 多个列组成一个索引,专门用于组合搜索(最左匹配原则)
  2. 最左匹配原则:
    name+age 两个列创建组合索引

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 1112 进行回表操作 去看height是否符合条件

下推之后是这样的:
在这里插入图片描述

age在回表前先过滤一次  剩下一条记录需要回表了 

MyISAM Innodb

索引类型 支持事物 支持表锁 支持行锁 支持外键 支持全文索引 适合操作
MyISAM 大量select
Innodb 是(5.6之后) 大量insert delete update

索引维护

  1. 如果插入一个比较大的数据 直接插入即可 几乎没有成本
  2. 如果插入中间某一个值 需要逻辑上移动后续元素 空出位置
  3. 如果插入数据页满了 需要单独申请一个新的数据页,然后移动部分数据过去,叫做页分裂,此时效率会收到影响 除了页分裂外 还有页合并
    比如删除的时候 如果删除完的页数量少于m/2 那么就需要合并 前边已经写过笔记
    尽量使用自增主键 会减少页分裂
发布了431 篇原创文章 · 获赞 91 · 访问量 25万+

猜你喜欢

转载自blog.csdn.net/qq_36291682/article/details/105609802