当前位置: 首页 > news >正文

深圳方维网站建设seo顾问服务 乐云践新专家

深圳方维网站建设,seo顾问服务 乐云践新专家,如何找厂家地址,志迅东莞网站建设索引能做什么?索引主要做3件事:过滤(filter)、排序或分组(sort/group)、覆盖(cover)。一个基本查询的工作流如下:1. 使用索引以查找匹配的记录,并得到数据的指针。2. 使用相关数据的指针;3. 返回查询到的记录。当可以使用覆盖索引…

索引能做什么?

索引主要做3件事:过滤(filter)、排序或分组(sort/group)、覆盖(cover)。

一个基本查询的工作流如下:

1. 使用索引以查找匹配的记录,并得到数据的指针。

2. 使用相关数据的指针;

3. 返回查询到的记录。

当可以使用覆盖索引时,索引将会覆盖查询中的所有字段,因此第二步将会被跳过,于是查询流程就变成了下面这样:

1. 使用索引以查找匹配的记录;

2. 返回查询到的记录。

大部分情况下,索引都比较小,可以加载在内存中,而数据很大,无法全部存放在内存里:当使用覆盖索引时,可以避免很多的磁盘操作,因此对性能也会有极大的改善。

下面让我们来看一些常见的查询案例。

单个等于查询(Single equality)

这是最基本的情景:

SELECT * FROM t WHERE c = 100

毫无疑问这种情况下,要给c字段创建索引。要注意的是,如果查询条件不够精确(if the criteria is not selective enough,这句话我不理解),优化器很可能会选择全表查询,因为这样有可能性能更好。

这种单个等于查询也包括只查询部分字段,而不是所有字段,如:

SELECT c1, c2 FROM t WHERE c = 100

这里应该创建一个(c,c1,c2)的索引,因为这样是覆盖索引。注意不是创建(c1,c2,c)!这同样也是覆盖索引,但是对过滤没什么帮助(记住MySQL索引的最左原则)。

多个等于查询(Multiple equalities)

SELECT * FROM t WHERE c = 100 and d = 'xyz'

这种情况也很容易优化:创建索引(c,d)或(d,c)。

最常见的错误是建立两个索引:一个是c,一个是d。尽管MySQL根据index_merge算法能同时使用这两个索引,但这样依然是糟糕的选择。详情参见以下几篇文章:https://www.percona.com/blog/2009/09/19/multi-column-indexes-vs-index-merge/,https://www.percona.com/blog/2012/12/14/the-optimization-that-often-isnt-index-merge-intersection/,https://www.percona.com/blog/2014/01/03/multiple-column-index-vs-multiple-indexes-with-mysql-56/)

等于与不等于并存的查询(Equality and inequality)

SELECT * FROM t WHERE c > 100 and d = 'xyz'

这种情况我们必须要小心,因为只要有一列使用了不等于计算,那么它将阻止其他列使用索引。

因此我们需要创建一个(d,c)的索引,这时候c和d两个条件都会走索引,这也是我们想要的结果。

而如果我们创建的是(c,d)索引,则只有c列的索引会被利用,这样效率会比较低。

因此,索引中字段的顺序对于这种等于/不等于并存的查询有极大的影响。

实例:当表students的联合索引为时,则只有第一个索引列phone被利用:

54aaa0153d01038065926c3d2ef04312.png

当表students的联合索引为时:

7d2e11d6c01c3b2e4f4294e71e831cfd.png

多个不等于查询(Multiple inequalities)

SELECT * FROM t WHERE c > 100 and b < 10 and d = 'xyz'

这里有两个不等于,前面已经说了不等于会终止索引查询,因此我们不可能做到b、c、d都被索引覆盖(注释1)。因此我们必须要做出决定,到底是创建索引(d,b)还是索引(d,c)?

在不知道表里具体数据的情况下,创建上面任何一种都无所谓,最关键的是,一定要把等于条件(在这里是d)所在列,放在索引的最左侧。

实例:表students索引状况,包含一个主键索引stud_id和一个联合索引:

a62d8d1f32f947cec7c4e82a4816be67.png

然后分析下查询结果:

789b14e9f6c40669ad12d3598d6f7db5.png

注释1:事实上还是有一种“曲线救国”的方法,能同时满足所有条件,即按照字段b分区(partition on b),然后创建索引(d,c),或按照字段c分区(partition onc),然后创建索引(d,b)。这个的细节已经超出了本文的讨论范围,不过这也是这种情况下的一种解决方法。

多个等于与排序(Equalities and sort)

SELECT * FROM t WHERE c = 100 and d = 'xyz' ORDER BY b

就像第一节中写的那样,索引可以过滤、排序,因此这个查询很容易优化。不过和不等于类似,我们对于索引中字段的顺序必须足够小心:要求是先过滤后排序。

根据上面“先过滤后排序”的要求可知,(c,d,b)或(d,c,b)是不错的选择;而(b,c,d)或(b,d,c)则比较糟糕,因为他们只排序,不过滤。

如果是下面这种情况:

SELECT c1, c2 FROM t WHERE c = 100 and d = 'xyz' ORDER BY b

我们可以创建一个集过滤、排序、覆盖于一体的索引:(c,d,b,c1,c2)。

不等于与排序(Inequality and sort)

常见的情况有2种。下面是情况一(不等于、等于、排序都有):

SELECT * FROM t WHERE c > 100 and d = 'xyz' ORDER BY b

这种情况有两种思路:(d,b)或(d,c)。至于哪种效率更高,这取决于你的数据,需要具体情况具体分析。

情况二如下(只有不等于和排序):

SELECT * FROM t WHERE c > 100 ORDER BY b

这种情况没有等于条件,因此b和c只能选一种,具体选哪一种同样和你的数据有关。通常情况下,选过滤的会多一些(即c字段)。

总结

本文并没有包含所有的情况,但同样指出了一些你必须要小心的地方。

参考文章:

http://www.lbrq.cn/news/2637829.html

相关文章:

  • 专业做网站咨询seo点击排名器
  • 了解网站建设企业seo整站优化方案
  • 二级域名购买平台优化设计英语
  • 成都微信网站建设多少优化关键词方法
  • 上海景点排名前十久久seo综合查询
  • 域名解析网站建设少女长尾关键词挖掘
  • 校园超市网站开发背景百度正版下载并安装
  • app制作网站有哪些 请列举网站及搜索引擎优化建议
  • 合肥++网站建设莆田seo
  • 宁波网页网站制作离我最近的广告公司
  • 购物网站哪个质量好电商培训机构有哪些哪家比较好
  • 东莞塘厦网站制作线上推广方案怎么写
  • jsp 网站开发教程新网站百度收录
  • 国家重点建设裤网站网络推广页面
  • 南京网站建设一条龙手机关键词排名优化
  • 做网站效果图总结优秀网站设计案例
  • 网上服务大厅登录抖音seo搜索优化
  • 做团购网站需要多少钱模板建站优点
  • 苏州做网站的杭州seo博客有哪些
  • 哪家公司建设网站临沂百度推广多少钱
  • 有哪些网站可以做推文今日疫情实时数据
  • 网站中下拉列表框怎么做长沙网络公司最新消息
  • 石河子农八师建设兵团社保网站推广联系方式
  • 软件代做网站在哪找活东莞百度推广排名
  • 永平建设有限公司网站中国十大企业培训机构排名
  • 网站设计步骤及注意事项百度指数搜索热度排行
  • 学习网页设计网站制作广州推广优化
  • 程序员做项目网站小时seo百度关键词点击器
  • 我国中小企业网站建设找培训机构的app
  • ipad做电影网站湖南网站建设效果
  • Vuex 数据共享
  • 第39周——训练自己的数据集
  • 用 “故事 + 价值观” 快速建立 IP 信任感
  • C++信息学奥赛一本通-第一部分-基础一-第2章-第5节
  • 数据持久化 —— `chrome.storage` 的记忆魔法
  • 《C语言》函数练习题--3