有时候,建索引并不一定会加快查询效率。但是,有时候,表的数据量是大数据量的话,还是要看下是否能使用索引优化查询效率。
1、建索引的几大原则:
1.1、最左前缀匹配原则非常重要的原则,mysql会一直向右匹配直到遇到范围查询(>、<、between、like)就停止匹配,比如a =1 and b = 2 and c > 3 and d = 4 如果建立(a,b,c,d)顺序的索引,d是用不到索引的,如果建立(a,b,d,c)的索引则都可以用到,a,b,d的顺序可以任意调整。
1.2、=和in可以乱序比如a = 1 and b = 2 and c = 3 建立(a,b,c)索引可以任意顺序,mysql的查询优化器会帮你优化成索引可以识别的形式。
1.3、尽量选择区分度高的列作为索引区分度的公式是count(distinct col)/count(*),表示字段不重复的比例,比例越大我们扫描的记录数越少,唯一键的区分度是1,而一些状态、性别字段可能在大数据面前区分度就是0,那可能有人会问,这个比例有什么经验值吗?使用场景不同,这个值也很难确定,一般需要join的字段我们都要求是0.1以上,即平均1条扫描10条记录。
1.4、索引列不能参与计算,保持列“干净”比如from_unixtime (create_time)= 2014-05-29’就不能使用到索引,原因很简单,b+ 树中存的都是数据表中的字段值,但进行检索时,需要把所有元素都应用函数才能比较,显然成本太大。所以语句应该写成create_time = unix_timestamp(’2014-05-29’);
1.5、尽量的扩展索引,不要新建索引。比如表中已经有a的索引,现在要加(a,b)的索引,那么只需要修改原来的索引即可。
2、索引原理
索引是一种数据结构,它通过特定的规则和算法,将数据与实际文件的位置关联起来,以加快数据的查找。索引节点包含实际文件的位置信息。在查找过程中,遵循索引的规则可以快速定位到对应数据的节点,从而实现快速查找数据的目的。索引这个概念在不同的技术领域中都有广泛的应用,例如在数据库中,它是一种常用的技术。在日常生活中,索引的概念也无处不在,如书本中的目录、座位号或考试编号等,它们都具备类似索引的功能。简而言之,所有通过特定规则数据结构和实际目标关联,并根据特定规则算法快速寻址的功能都可以称为索引。
比如说,
a、要在一栋楼里找1205号的出租屋,
那就先让指针先指向12楼,已经锁定12楼后,再在12楼里面找到05号房间。
b、或者要找东朝向的12楼偏中间的房子,
那就让指针先指向东朝向的所有房子,相当于现实生活中,找房子的人,站在该栋楼的东面看东朝向的房子,而不用关心西朝向、北朝向、南朝向的房子。站在东面看东朝向的房子,然后指针跳到12楼,再在12楼找偏中间的房子。
更多内容请参考:索引的原理-CSDN博客
这篇文章写得挺好的。
学习笔记:
二分查找算法关键步骤就是找到区间的中间值,然后确定要查找的值落在左区间还是右区间,一直重复这个步骤直到找到该值。于是就可以将这种查询方法映射成一种数据结构——树。我们规定一种树,有左节点,右节点,和当前节点。并且左节点 < 当前节点 < 右节点 . 如下图所示:
由于树具有方便快速查找的特性,我们一般都会使用树结构去存储索引,并对简单的查找二叉树做了很多优化,比如 红黑树,平衡二叉树, B 树 B+树
树的构建,删除, 查找都有一定的算法,这里不详细描述,只需知道树有一个通用的特性:树的高度越低,查找效率越高
所以索引的构建 , 本质上是控制树的高度
索引有如下数据结构:
a、二叉树
b、红黑树
c、Hash表
d、B Tree和B+ Tree
简单的二叉树,顺序插入数据,导致树的深度会越来越高,影响查询效率。