标签:回表 非礼 name age m06 索引 mysql where 主键
索引分类
1.主键索引
主键是一种唯一索引,但他必须制定为PRIMARY KEY ,每个表只能有一个主键(一个主键指的不是一个列 也可能有多个列联合主键)
其实主键没有的话 数据库会根据唯一键 建立索引
如果唯一键也没有 数据库会自动生成一个不可见的row_id作为记录唯一标示建立索引
自增主键:是通过一个自增锁来实现的 如果新增失败 就会少几个值
没有特殊需求 可以用自增主键: 减少页的分裂 &合并
2. 唯一索引
索引列的所有值 只能出现一次 既必须唯一 值可以是空
唯一索引不用回表
3. 普通索引
基本的索引类型,值可以为空,没有唯一索引的限制(覆盖索引)
查找数据需要回表
覆盖索引:直接从普通索引中获取到id 不用回表 就叫覆盖索引
全文索引
- 全文索引的索引类型为FULLTEXT
- 全文索引可以在varchar 、 char 、text类型的列上创建
- MyISAM支持 Innodb 在5.6之后支持
- 公司一般不用 都用程序支持Elasticsearch solor 等
组合索引
- 多个列组成一个索引,专门用于组合搜索(最左匹配原则)
- 最左匹配原则:
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 |
索引维护
- 如果插入一个比较大的数据 直接插入即可 几乎没有成本
- 如果插入中间某一个值 需要逻辑上移动后续元素 空出位置
- 如果插入数据页满了 需要单独申请一个新的数据页,然后移动部分数据过去,叫做页分裂,此时效率会收到影响 除了页分裂外 还有页合并
比如删除的时候 如果删除完的页数量少于m/2 那么就需要合并 前边已经写过笔记
尽量使用自增主键 会减少页分裂
标签:回表,非礼,name,age,m06,索引,mysql,where,主键
来源: https://blog.51cto.com/u_12198094/2705773
本站声明:
1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。