加入收藏 | 设为首页 | 会员中心 | 我要投稿 天瑞地安资讯网_保定站长网 (https://www.52baoding.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MySql教程 > 正文

MySQL索引总结

发布时间:2022-09-30 12:59:17 所属栏目:MySql教程 来源:
导读:  全值匹配

  当where条件所用的索引属于联合索引时,使用全值匹配,比如联合索引(a,b,c),则查询的时候使用(a),(a,b),(a,b,c) 都是可以的,因为都符合最左前缀原则,但是(a,b,c)会更好,因为区分度大,
  全值匹配
 
  当where条件所用的索引属于联合索引时,使用全值匹配,比如联合索引(a,b,c),则查询的时候使用(a),(a,b),(a,b,c) 都是可以的,因为都符合最左前缀原则,但是(a,b,c)会更好,因为区分度大,可能需要扫描的行数更少。
 
  最左前缀法则
 
  需要考虑最左前缀法则。它很有用。
 
  like以通配符开头,索引会失效
 
  索引列上不合适的操作
 
  在索引列上进行计算、使用函数函数、做类型转换,这些操作都会使索引失效而走全表扫描
 
  因为做了这些操作之后数据发生变化,与B+tree 上的索引数据不一致,无法走索引,只能全表扫描。
 
  SELECT * FROM XXX WHERE a+1 = 100  //计算
  SELECT * FROM XXX WHERE DATE(hire_time) ='2018-09-30'//函数
  SELECT CONVERT(INT,'1234') //类型转换
  联合索引做范围查找注意事项
 
  使用联合索引做范围查找时索引中范围条件右边的索引字段会失效
 
  比如联合索引 (a,b,c)
 
  SELECT * FROM XXX WHERE a = '1' AND b > 10 AND c = 4 // 只用上了 a,b  
  因为在创建联合索引时,索引的生成规则是按顺序进行,所以会先根据 a 排序,假如有几个 a 值相等,这几个会继续根据 b 排序mysql表索引,以此递推。所以 a,b 都能用上,但是 b > 10 跟 c = 4 没有关系有可能存在 b = 9 ,c = 4,所以c 这个索引字段用不上。
 
  多使用覆盖索引
 
  只访问索引的查询(索引列包含查询列),不使用 select *
 
  索引可能不生效的情况
 
  取决于MySQL内部优化器根据检索比例、表大小等多个因素的整体评估
 
  条件类型要匹配使用,避免发生转换
 
  比如 name 字段是 VARCHAR 类型,在WHERE 条件中判断与 1000 是否相等。可能导致隐式类型转换而走全表扫描
 
  SELECT * FROM xxxxx WHERE name = 1000;
  范围查找优化
 
  将大范围拆分为小范围
 
  范围查找时有可能因为数据太多,MySQL 评估后觉得走全表扫描效率更高。将大范围拆分为小范围之后,就可能可以走索引
 

(编辑:天瑞地安资讯网_保定站长网)

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