加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MySql教程 > 正文

Mysql入门MySQL InnoDB索引介绍及优化(二)

发布时间:2020-12-12 00:48:00 所属栏目:MySql教程 来源:网络整理
导读:《Mysql入门MySQL InnoDB索引介绍及优化(二)》要点: 本文介绍了Mysql入门MySQL InnoDB索引介绍及优化(二),希望对您有用。如果有疑问,可以联系我们。 导读:MySQL InnoDB索引介绍及优化(二) 八、再来看看如何在长字段上建立索引呢 首先,在较长的字段上建立

《Mysql入门MySQL InnoDB索引介绍及优化(二)》要点:
本文介绍了Mysql入门MySQL InnoDB索引介绍及优化(二),希望对您有用。如果有疑问,可以联系我们。

导读:MySQL InnoDB索引介绍及优化(二) 八、再来看看如何在长字段上建立索引呢
首先,在较长的字段上建立索引是非常影响性能的,比如文章等超大varchar或者text字段,如果不是非建不可,一般不推荐,另外对InnoDB索引单字段(utf8)只能取前767bytes

那么如何处理长字段索引?

主要根据类型来分别处理:
1、Email类,可以建立前缀索引
mail_addr varchar(2048)
idx_mailadd(mail_addr(39))?? -> 正确
解析:由于email邮件类型字段,一般后缀都有较大可能相同,如.com .cn等等,而前缀相同的可能性较低,且邮箱一般长度较短,因此可以建立前缀索引

2、住址类,分拆字段
home_addr varchar(2048)
idx_homeadd(home_addr(30))??? ->错误,很可能前半段是相同的省市区街道名

province_add varchar(1024),city_add varchar(1024),district_add `varchar(1024),lolcal_add varchar(1024)??? --建立联合索引或者单列索引 ->正确`

九、对核心SQL索引做覆盖扫描

对于最核心的SQL,我们可以考虑使用索引覆盖,什么是索引覆盖呢,下面是个例子

select name from tb_user where userid=?
key idx_uid_name(userid,name)?? ->覆盖索引扫描
我们查询用户名这种操作频率非常高,而索引里面又存储了字段的值,因此在我们做查询时,name字段的值直接在索引中返回,而不需要回表;还有一个使用非常广泛的例子:用户登陆,我们可以将username password做覆盖索引,这样大大提高登陆验证的速度

因此覆盖索引覆盖就是将你要查询的字段和条件字段一起建立联合索引,这样的好处是不需要回表获取name字段,IO最小,速度块

十、哪些情况无法使用索引?

1、索引列进行数据运算或者函数运算

eg:
?? where id+1=10;??? ->错误,无法利用到索引
?? where id=(10-1)?? ->正确

?? where year(id) < 2016????? ->错误,无法利用到索引
?? where col < '2016-01-01'?? ->正确
2、未含复合索引的前缀字段

idx_abc(a,b,c)
where b=? and c=??? ->错误,无法利用到索引
正确的建立索引方式(b,c)
3、前缀通配符"_" "%"等

like '%ttt%'?? ->错误,无法利用到索引
like "ttt%"??? ->正确
4、where条件使用NOT,<>,!= 通常也无法使用到索引

5、字段类型不匹配

字段类型并不绝对匹配时,可能会导致无法使用索引
a int(11),idx_a(a)
where a = '123'?? ->错误,可能导致未知的错误,这个跟编码有关系
where a = 123???? ->正确

十一、利用索引做排序操作

以 idx_ab(a,b)索引为例
1、能使用上述索引进行排序的操作是:

order by a;
a = 3 order by b;
order by a,b;
order by a desc,b desc;
a > 5 order by a;
2、不能使用索引帮助排序的查询

order by b; #没有使用到联合索引的第一个字段

a > 5 order by b;? #一旦前缀操作是一个range而非=操作,那么就无法利用到索引,
这里 a>5无法利用索引,二联合索引的第一个字段未利用,
因此 order by b也无法利用索引查询

a in (1,3) order by b; #in里面的值没有建立索引,因此无法利用索引,a未用因此order by b也无法使用

order by a asc,b desc; #这里order by a esc是利用了索引,但是b desc未利用到,因为b要和a排序方式一致才可利用到索引

十二、如何确定一个查询有没有走索引,走了哪些索引?

MySQL中自带命令行工具 explain 来查看一个sql语句是否了索引

使用方式:

explain select * from tb_test;
关注的项:

1、type : 查询access的方式,表的连接类型
?????
????? index |? 索引?
????? full? |? 全表扫描
????? ref?? |? 参照查询,也就是等值查询?
????? range |? 范围查询
2、key? : 本次查询最终选择使用哪个索引,NULL为未使用索引
3、key_len : 选择的索引使用的前缀长度或者整个长度
4、rows??? : 查询逻辑扫描过的记录行数
5、extra?? : 额外信息,主要是指fetch data的具体方式
总结:索引的本质还是提升我们查询数据库的速度,减少服务器I/O开销,提供更稳定快捷的服务



(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读