【数据库基础】联合索引是什么?为什么要用它?用它时要注意什么?
2018-03-26 19:13
197 查看
联合索引是什么
对多个字段同时建立的索引(有顺序,ABC,ACB是完全不同的两种联合索引。)为什么要用
以联合索引(a,b,c)为例建立这样的索引相当于建立了索引a、ab、abc三个索引。一个索引顶三个索引当然是好事,毕竟每多一个索引,都会增加写操作的开销和磁盘空间的开销。
覆盖(动词)索引。同样的有联合索引(a,b,c),如果有如下的sql: select a,b,c from table where a=xxx and b = xxx。那么MySQL可以直接通过遍历索引取得数据,而无需读表,这减少了很多的随机io操作。减少io操作,特别的随机io其实是dba主要的优化策略。所以,在真正的实际应用中,覆盖索引是主要的提升性能的优化手段之一
索引列越多,通过索引筛选出的数据越少。有1000W条数据的表,有如下sql:select * from table where a = 1 and b =2 and c = 3,假设每个条件可以筛选出10%的数据,如果只有单值索引,那么通过该索引能筛选出1000W*10%=100w 条数据,然后再回表从100w条数据中找到符合b=2 and c= 3的数据,然后再排序,再分页;如果是复合索引,通过索引筛选出1000w *10% *10% *10%=1w,然后再排序、分页,哪个更高效,一眼便知
使用时注意什么
单个索引需要注意的事项,组合索引全部通用。比如索引列不要参与计算啊、or的两侧要么都索引列,要么都不是索引列啊、模糊匹配的时候%不要在头部啦等等最左匹配原则。(A,B,C) 这样3列,mysql会首先匹配A,然后再B,C.
如果用(B,C)这样的数据来检索的话,就会找不到A使得索引失效。如果使用(A,C)这样的数据来检索的话,就会先找到所有A的值然后匹配C,此时联合索引是失效的。
把最常用的,筛选数据最多的字段放在左侧。
相关文章推荐
- 2018/01/08JAVA 基础 / 接口与继承/Object类——[思考?question:Object类的方法有什么用?为什么不直接在类中设计方法?
- javabean实现serializable有什么用?为什么数据库持久就Bean实现这个接口?
- [数据库基础]——编码标准之编码注意事项(持续更新)
- 将数据库操作类写在app_Code里面有什么不好?为什么不用三层架构?
- SQL 数据库 学习 003 什么是数据库? 为什么需要数据库?是不是所有的软件都是用Sql Server?
- javabean实现serializable有什么用?为什么数据库持久就Bean实现这个接口?
- 【OC学习-12】什么是类的继承?为什么要继承?以及继承里面的注意事项
- Hive简介、什么是Hive、为什么使用Hive、Hive的特点、Hive架构图、Hive基本组成、Hive与Hadoop的关系、Hive与传统数据库对比、Hive数据存储(来自学习资料)
- Hibernate 先get 一个实体数据,在修改数据,为新的数据,再add到数据库,需要注意什么?
- 数据库中为什么要有恢复子系统?它的功能是什么?
- [数据库基础]——编码标准之编码注意事项(持续更新)
- 数据库中为什么药建立索引,建立索引有什么优点和缺点?
- 为什么要引入锁(无论什么数据库软件引入锁的目的都是因数据不一致的三种情况,这里介绍的是MS-SQLSERVER )
- Java零基础,学习hadoop:为什么要编译Java源代码,编译后会有什么效果
- MySQL 数据库中的字段类型 varchar 和 char 的主要区别是什么?哪 种字段的查找效率要高,为什么?
- SQL 必知必会-- 第1课:数据库基础和什么是SQL
- mysql5.7基础 show create database... 查看一个数据库用的是什么字符编码
- 交换友链有什么注意事项嘛?为什么我交换几十个关键词排名都不见增长
- 很难界定数据库与编程的关系,学数据库最基础的是什么
- 简单说说什么是数据库的事务管理,以及为什么要数据库事务管理。