关于数据库查询业务的几点思考

勿忘初心2018-10-11 16:05


1、对查询字段建索引;

这个效果很明显,建索引可以提升非常大的速度;

在这里不得不讲一下普通索引和唯一性索引的区别:

  1. 普通索引

  普通索引的唯一任务是加快对数据的访问速度。因此,应该只为那些最经常出现在查询条件(WHERE column = )或排序条件(ORDER BY column)中的数据列创建索引。只要有可能,就应该选择一个数据最整齐、最紧凑的数据列(如一个整数类型的数据列)来创建索引。

  1. 唯一索引

  普通索引允许被索引的数据列包含重复的值。比如说,因为人有可能同名,所以同一个姓名在同一个“员工个人资料”数据表里可能出现两次或更多次。 如果能确定某个数据列将只包含彼此各不相同的值,在为这个数据列创建索引的时候就应该用关键字UNIQUE把它定义为一个唯一索引。这么做的好处:一是简化了MySQL对这个索引的管理工作,这个索引也因此而变得更有效率;二是MySQL会在有新记录插入数据表时,自动检查新记录的这个字段的值是否已经在某个记录的这个字段里出现过了;如果是,MySQL将拒绝插入那条新记录。也就是说,唯一索引可以保证数据记录的唯一性。事实上,在许多场合,人们创建唯一索引的目的往往不是为了提高访问速度,而只是为了避免数据出现重复。

  1. 复合索引

    用户可以在多个列上建立索引,这种索引叫做复合索引(组合索引)。 复合索引在数据库操作期间所需的开销更小,可以代替多个单一索引;同时有两个概念叫做窄索引和宽索引,窄索引是指索引列为1-2列的索引,宽索引也就是索引列超过2列的索引;设计索引的一个重要原则就是能用窄索引不用宽索引,因为窄索引往往比组合索引更有效;

当建立复合索引index(column1,column2,column3),这就相当于建立了以下三个索引:

index(column1),index(column1,column2)index(column1,column2,column3)  // 跟三个字段的顺序没有关系   比如:index(column3,column1,column2),它们是一样的效果

注意事项:

  • 对于复合索引,在查询使用时,最好将条件顺序按照索引的顺序,这样效率最高;

select * from table1 where col1=A AND col2=B AND col3=D

如果使用 where col2=B AND col1=A 或者 where col2=B 将不会使用索引

  • 何时使用复合索引
    根据where条件建索引是极其重要的一个原则; 注意不要过多用索引,否则对表更新的效率有很大的影响,因为在操作表的时候要化大量时间花在创建索引中

  • 复合索引会替代单一索引么
    如果索引满足窄索引的情况下可以建立复合索引,这样可以节约空间和时间

备注: 对一张表来说,如果有一个复合索引 on (col1,col2),就没有必要同时建立一个单索引 on col1; 如果查询条件需要,可以在已有单索引 on(col1)的情况下,添加复合索引on (col1,col2),对于效率有一定的提高 同时建立多字段(包含5、6个字段)的复合索引没有特别多的好处,相对而言,建立多个窄字段(仅包含一个,或顶多2个字段)的索引可以达到更好的效率和灵活性

2、不要连表查询

2.1 如何处理不在表中的字段的展示?

先查对应数据的页,在通过页中的数据id,到其它表中查找需要的字段; 比如A表中有字段 Aid, colA1, colA2 ,B表中有字段 Bid, colB1, colB2, Aid, 而需要获取的字段有 colB1, colB2,colA1, colA2 这个时候可以这样操作:

  • 第一步:根据查询条件获取B表中的数据 Bid, coldB1, colB2, Aid

  • 第二步:根据获取到的Aid,从A表中获取另外两列colA1, colA2 尽量获取数据的方式没有连表查询来的简单,但可以在大数据量的时候,减少查询或者传输数据所消耗的时间,尤其是在分页查询的时候。

2.2 如何处理在查询条件中的字段?

先将查询条件从其它表中找出对应的id,再将id作为查询条件,至目标表中进行查询;

同样是2.1中所提到的A,B表。假如查询字段是colA1,而需要获取的字段是colB1, colB2 这个时候可以这样操作:

  • 第一步:根据colA1,线从A表中获取对应的数据Aid字段(当查询前已经可以确定Aid时,该步骤可以省略,这步更适合colA1是作为模糊查询呢的条件进行查询的情况)

  • 第二步:根据Aid字段,从B表中获取所需要的字段colB1,colB2

同样,该组查询也只是考虑在数据量比较大的时候,对于小数据的时候,没什么必要。

2.3 其它减少连表查询的方法

  • 提供冗余字段,即将A表中需要展示的字段,提前放入B表中,两边各存一份,这会增加维护和更新的成本,但可以避免连表查询,可以视业务场景考虑使用

3 结尾

以上仅仅是个人对数据库中部分查询业务的思考,希望在服务运行过程中,可以对服务的调用起到一定的效率提升,如处理方式不妥之处,还请各位大大指正,共同探讨更好的优化方案。


本文来自网易云社区 ,经作者王飞授权发布。

网易云免费体验馆,0成本体验20+款云产品!

更多网易研发、产品、运营经验分享请访问网易云社区


相关文章:
【推荐】 Lily-一个埋点管理工具
【推荐】 延迟任务调度系统—技术选型与设计(上篇)
【推荐】 Kylin存储和查询的分片问题