什么是索引?
有人说“索引就是一本书的目录,当我们想要快速的找到某个点时就可以通过目录直接跳到相应地方”,这只是一个通俗的说法,索引的定义是:索引是为了加速对表中数据行的检索而创建的一个分散存储的数据结构。它是一种数据结构而且是B+TREE结构。
为什么要创建索引?
正确的创建合适的索引会提高数据库查询的效率,如何理解创建索引可以提高查询的效率呢?
我们通常对数据表的检索方式是根据你的检索条件对全表进行扫描,逐步获取结果集。如果在某个字段建立索引,那么查询时会去索引列表中一次定位到特定值的那一行,因此索引可以大大减少存储引擎所需要扫描的数据量。
这样说还是有些笼统。我们可以想一下,通常可以使用什么什么样结构来提高查找效率呢?很容易会想到树型结构,二叉树,平衡二叉树等,还有更高级的B树,B树又称为多路平衡二叉树,由于他有多路分叉,所以高度也就更低,因此他的查询效率也要更高。
B树
而索引的数据结构为B+树,也就是加强版的B树
他和B树的区别在于1.关键字是闭合区间 2.他的非叶子节点不存数据,只保存关键字和和子节点的应用 3.关键字对应数据保存在叶子节点中。4.叶子节点顺序排列,并且相邻节点可以顺序引用。
B+树的好处显而易见:它拥有B树的同样的优势,同时扫描库,表的能力也要更强、他优化了磁盘的读写性能,他一次IO加载的数据比B树更多,读写的次数更少,所以读写能力更强,而且B+树的排序能力更强,B+树的结构天然就在叶子节点排好序了。而且由于只用叶子节点存放数据,所以查询效率更加稳定。
MySQL索引表现形式有两种——myisam、innodb
myisam有三个文件myisam.frm——保存表结构、myisam.myi——存放索引、myisam.myd——存放数据
innodb有两个文件innodb.frm——存储表结构、innodb.ibd——这里有所不同,他是将索引和数据放在一起的,他是以主键为索引来组织数据的存储的。
主键索引:以主键为索引来组织数据的存储,由于主键中所有值都唯一,所以实现对数据的快速访问
聚集索引:数据表行中数据的物理顺序与逻辑(索引)顺序相同。
什么时候需要建立索引?
当你需要对索引列中的数据进行反复的访问时,就可以建立索引。索引占用磁盘空间,并且降低添加、删除和更新行的速度。
索引列:可以基于数据库表中的单列或多列创建索引。多列索引使您可以区分其中一列可能有相同值的行。当然了,如果你的表很小的化就没必要建立索引了。
如何确定索引的有效性呢?
通过检查where和join子句,对子句的每一列都确保为索引选择的对象。
试验新索引确定查询性能
避免但张表有多个索引
避免包共享列的重叠索引,比如你建立一个以姓名,年龄两列的索引,就没必要在建立一个姓名索引
确定表中某列数据的分散性,即看列中某唯一值的数量与表行数对比,数据值越是唯一,越适合建立索引。
建立方式
针对where或join子句的相关列建立索引
假设由张表t_student(id,no,name,age,phone) 如果你有下面的查询语句
select * from t_student where no = '12345';
这个时候就在no列建立索引:create INDEX student_no ON t_student (no);
如果这个时候我有多个条件选择呢?比如 select * from t_student where no ='12345' and age = '20';
此时可以CREATE INDEX student_no_age ON t_student (no,age);
那么如何知道数据库会不会用这些索引呢?
可以用explain + 查询语句 就可以得到一个结构
例:
如果用了索引,在possible_k列中可以看出,正常没有索引的查询type显示为ALL,也就是全表查询。