innodb表的聚集索引和普通索引的区别(从数据存储角度),组合索引和单列索引的区别.

innodb 聚集索引和普通索引

Innodb 聚集索引是按照主键(primarykey)进行聚集,被索引的列其实是主键列,如果没定义主键,Innodb会试着使用唯一非空索引Unique Index来代替,如果还找不到,Innodb就会定义隐藏主键然后在上面进行索引聚集。出了主键的聚集索引,其他索引(普通索引)中不会保存行的物理位置,而是保存主键的值,所以通过"二级索引"进行查找是先找到主键,再找到行,要进行二次索引查找。

组合索引和单列索引
组合索引在多列上创建,单列索引在一个列上创建。
查询使用索引的条件不同一般组合索引需要按照“最左前缀”来执行查询,并不是每个列都需要覆盖,只是从左边的列开始组合。
  例如有索引key(a,b,c)
where a=xx and b=xx and c=xxx 此语句可以用到索引
where b=xx and a=xx and c=xxx 同上,顺序没有关系,同样能用到索引
where a=xx and b=xx 可以用到索引
where a=xx and c=xx 可以用到索引
where b=xx and c=xx 用不到索引
where b=xx 用不到索引
where c=xx 用不到索引

在性能方面,如果查询既能满足单列索引,又能满足多列索引,那么通过组合索引能够加快查询的速度。如果分别创建索引的话MYSQL查询优化器就会按照哪种方式能够找到最少记录的决定使用哪个索引值的!但是组合索引因为索引了多列,所以在更新方面可能会导致性性能下降。

文档给出的使用索引的建议:
1. 对于单键索引,尽量选择针对当前Query 过滤性更好的索引;
2. 在选择组合索引的时候,当前Query 中过滤性最好的字段在索引字段顺序中排列越靠前越好;
3. 在选择组合索引的时候,尽量选择可以能够包含当前Query 的WHERE 子句中更多字段的索
引;
4. 尽可能通过分析统计信息和调整Query 的写法来达到选择合适索引的目的而减少通过使用
Hint 人为控制索引的选择,因为这会使后期的维护成本增加,同时增加维护所带来的潜在风险


MySQL 中索引使用相关的限制(一般是指单列索引)。
1. MyISAM 存储引擎索引键长度总和不能超过1000 字节;
2. BLOB 和TEXT 类型的列只能创建前缀索引;其实也可以创建fulltext索引。
3. MySQL 目前不支持函数索引;
4. 使用不等于(!= 或者<>)的时候MySQL 无法使用索引;
5. 过滤字段使用了函数运算后(如abs(column)),MySQL 无法使用索引;
6. Join 语句中Join 条件字段类型不一致的时候MySQL 无法使用索引;
7. 使用LIKE 操作的时候如果条件以通配符开始( '%abc...')MySQL 无法使用索引;
8. 使用非等值查询的时候MySQL 无法使用Hash 索引;


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值