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)会更好,因为区分度大,
|
全值匹配 当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 评估后觉得走全表扫描效率更高。将大范围拆分为小范围之后,就可能可以走索引 (编辑:天瑞地安资讯网_保定站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
站长推荐

