ICode9

精准搜索请尝试: 精确搜索
首页 > 数据库> 文章详细

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

2021-04-14 15:04:27  阅读:211  来源: 互联网

标签:回表 非礼 name age m06 索引 mysql where 主键


索引分类

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

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

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

MyISAM Innodb

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

索引维护

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

标签:回表,非礼,name,age,m06,索引,mysql,where,主键
来源: https://blog.51cto.com/u_12198094/2705773

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有