MySQL--索引

1.对有索引的数据列进行查询时速度比较快

2.如果索引了多列(联合索引),要遵循最左前缀法则,即查询从最左边的开始,不跳过中间的列,如果跳过中间的列则后面索引失效。(与编写的SQL中的顺序无关)

3.出现范围查询>  <后后面的索引失效,但是使用>=  <=就不失效,因此在业务允许的情况下尽量使用>= 和<=.

4.等值查询时索引存在,但是对索引字段进行函数操作或者是运算后索引失效。

5.对于字符串类型不加引号的索引失效,虽然结果不影响,但是数据库存在隐式转换,索引失效。

6.模糊查询中,在关键词前加%索引失效,在尾部加不失效。

7.or连接,当or前后语句中有列没有索引,所涉及的索引都失效。因此要针对没有索引的列建立索引。

8.mysql会评估使用索引和不用索引的效率,如果使用索引更慢,就不使用索引走全局扫描。得具体情况具体分析,不是固定的。

9.当有多个索引可以用的时候,mysql会自己评估哪个更好然后自动选择。当然也可以人为干预:SQL提示。

  • 建议使用xx索引,但是只是建议,mysql内部还会评估
explain select * from tb_user use index(idx_user_pro) where profession = '软件工
程';
  • 忽略索引
explain select * from tb_user ignore index(idx_user_pro) where profession = '软件工
程';
  • 强制索引
explain select * from tb_user force index(idx_user_pro) where profession = '软件工
程';

10.尽量使用覆盖索引,减少select *。大概意思就是进行使用在索引内的字段走二级索引,如果查出了这个字段或者是所有字段范围,就要拿到所有的主键id,再去扫描聚集索引,再获取额外的数据,这个过程就是回表。

聚集索引:将数据存储与索引放到了一块,索引结构的叶子 节点保存了行数据,如果存在主键,主键索引就是聚集索引。如果表没有主键,或没有合适的唯一索引,则InnoDB会自动生成一个rowid作为隐藏的聚集索 引。

select id,username,password from tb_user where username =
'itcast';

上述情况可以构建username和password的联合索引,避免出现回表查询。

11.当字段类型为字符串时,可以只将字符串的一部分前缀建立索引,具体长度的设置可以根据索引的选择性,指不重复的索引值数/数据总数,值越大性能越好。

12.有单个索引a,b,当查询返回a,b两个字段的时候,查询中只能使用一个索引,另一个字段会回表查询来返回,因此针对这种情况要创建这两个字段的联合索引。

13.索引设计原则:

  • 针对于数据量较大,且查询比较频繁的表建立索引
  • 针对于常作为查询条件(where)、排序(order by)、分组(group by)操作的字段建立索 引。
  • 尽量选择区分度高的列作为索引,尽量建立唯一索引,区分度越高,使用索引的效率越高
  • 如果是字符串类型的字段,字段的长度较长,可以针对于字段的特点,建立前缀索引。
  • 尽量使用联合索引,减少单列索引,查询时,联合索引很多时候可以覆盖索引,节省存储空间, 避免回表,提高查询效率。
  • 要控制索引的数量,索引并不是多多益善,索引越多,维护索引结构的代价也就越大,会影响增 删改的效率。
  • 如果索引列不能存储NULL值,请在创建表时使用NOT NULL约束它。当优化器知道每列是否包含 NULL值时,它可以更好地确定哪个索引最有效地用于查询。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值