2.当b 树的数据项是复合的数据结构,比如(name,age,sex)的时候,b 数是按照从左到右的顺序来建立搜索树的,比如当(张三,20,F)这样的数据来检索的时候,b 树会优先比较name来确定下一步的所搜方向,如果name相同再依次比较age和sex,最后得到检索的数据;但当(20,F)这样的没有name的数据来的时候,b 树就不知道下一步该查哪个节点,因为建立搜索树的时候name就是第一个比较因子,必须要先根据name来搜索才能知道下一步去哪里查询 。比如当(张三,F)这样的数据来检索时,b 树可以用name来指定搜索方向,但下一个字段age的缺失,所以只能把名字等于张三的数据都找到,然后再匹配性别是F的数据了,这个是非常重要的性质,即索引的最左匹配特性 。
慢查询优化 关于MySQL索引原理是比较枯燥的东西,大家只需要有一个感性的认识,并不需要理解得非常透彻和深入 。我们回头来看看一开始我们说的慢查询,了解完索引原理之后,大家是不是有什么想法呢?先总结一下索引的几大基本原则
建索引的几大原则
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的顺序可以任意调整 。
2.=和in可以乱序
比如a = 1 and b = 2 and c = 3 建立(a,b,c)索引可以任意顺序,mysql的查询优化器会帮你优化成索引可以识别的形式
3.尽量选择区分度高的列作为索引
区分度的公式是count(distinct col)/count(*),表示字段不重复的比例,比例越大我们扫描的记录数越少,唯一键的区分度是1,而一些状态、性别字段可能在大数据面前区分度就是0,那可能有人会问,这个比例有什么经验值吗?使用场景不同,这个值也很难确定,一般需要join的字段我们都要求是0.1以上,即平均1条扫描10条记录
【sql优化的方法及思路 mysql慢查询优化方法】4.索引列不能参与计算,保持列“干净”
比如from_unixtime(create_time) = ’2014-05-29’就不能使用到索引,原因很简单,b 树中存的都是数据表中的字段值,但进行检索时,需要把所有元素都应用函数才能比较,显然成本太大 。所以语句应该写成create_time = unix_timestamp(’2014-05-29’);
5.尽量的扩展索引,不要新建索引 。
比如表中已经有a的索引,现在要加(a,b)的索引,那么只需要修改原来的索引即可
查询优化神器 – explain命令
关于explain命令相信大家并不陌生,具体用法和字段含义可以参考官网explain-output,这里需要强调rows是核心指标,绝大部分rows小的语句执行一定很快(有例外,下面会讲到) 。所以优化语句基本上都是在优化rows 。
猜你喜欢
- 零投资创业有哪些好项目, 不起眼的暴利小生意推荐
- ppt和pptx的区别 如何区别ppt和pptx
- 东京喰种独眼枭和不杀之枭的区别
- 2大写怎么写呀?
- 简单快解酒方法 简单有效的解酒方法介绍
- 做ppt最常用的技巧 做ppt最常用方法
- 菠菜鸡蛋炒粉条怎么做 制作菠菜鸡蛋炒粉条的方法
- 莫山山结局是怎么样的
- 原神主角的命之座怎么激活 原神主角的命之座激活方法介绍
- 目前最好的洋葱种子是什么
