mysql索引要素_mysql 索引优化的要点(系列一)

背景:sql 优化对数据来说是什么非常重要,sql的索引优化更重中之重,有的人认为索引优化就是简单加一个索引,其实这种想法是错的,索引是涉及到很多知识点,并非大家想得这么简单,废话不多说,马上开车!

一,头盘:

SQL语句的五大要素:

1,获得结果集所需访问的查询条件

2,定义结果集所需的查询条件

3,结果集的大小

4,获得结果集所涉及的表的数量

5,多少用户同时修改这些数据

二,主菜:索引的一些特性和优化建议

1,经常变的索引列放在最后,这样会降低变更成本

2,索引字段的顺序非常重要,如果排序前有范围查询就不能使用索引排序,如:

索引A(a,b.c)

select a,b,c from t where a=1 and b between d1 and d2 order by c;

这样就需要排序

索引B(a,c,b)

就不用排序

--备注:

一般来说会优先选择B不需要排序,因为一般来说一个事务每次查询的结果集都是很小的,会限定输出的结果集,这个时候不用排序就会很快,选择索引A时结果集要排序,如果结果集(满足条件的结果)很大的话,这样是会很慢的

3,当以下三个条件同时满足,过虑因子隐患可以会产生:

1),访问路径中没有排序

2),第一屏幕结果一建立就回应

3),不是所有的谓词字段都参与定义待扫描的索引片

4,使用短索引。如果对多列进行索引,应该指定一个前缀长度,只要有可能就应该这样做。

例如,如果有一个CHAR(200) 列,如果在前10 个或20 个字符内,多数值是惟一的,

那么就不要对整个列进行索引。对前10 个或20 个字符进行索引能够节省大量索引空

间,也可能会使查询更快。较小的索引涉及的磁盘I/O 较少,较短的值比较起来更快。

更为重要的是,对于较短的键值,索引高速缓存中的块能容纳更多的键值,因此,MySQL

也可以在内存中容纳更多的值。这增加了找到行而不用读取索引中较多块的可能性。

(当然,应该利用一些常识。如仅用列值的第一个字符进行索引是不可能有多大好处的,因为这个索引中不会有许多不同的值)

5,物化结果集:是指执行必要的数据库访问来构建结果集(比如排序)

1)为了避免不必要的工作,数据库系统总是尽可能晚地去进行物化结果,如果数据库系统先物化结果集,那么在FETCH调用的时候,系统将从临时表中检索记录,而在数据更新的时候,并不会更新临时表中存放的结果集

2)一次FETCH调用物化一条记录

如果满足的条件:

(1)没有排序需求

(2)存在一个可以满足结果集的索引

3)提前物化

(1)一般来说有排序都要提前物化,结果集排序,就是只需要提取一条记录,也必须物化整个结果集

6,过滤因子隐患

过滤因子:被用来定义谓词的选择性:满足谓词条件的记录数占表行总数的比例,该值取决于列值的分布情况,当评估一个索引是否合适时,最差的情况的过滤因子比平时的过滤因子更重要

半宽索引:一个包含where子句中所有列是的索引,使用半宽索引时,只有检索到匹配条件时才会访问表,而这个访问是随机读

宽索引:一个包含了select 语句中所涉及的所有字段的索引,包括投影的字段和where子句中的字段,使用这种索引时,不需要读表

结论:宽索引的优势在于避免了返回的结果集的回表随时读

三,下车收工

下次和大家分享三星索引

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值