面试官:请你说下对于一张很大的表应该如何做查询优化

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS PostgreSQL,集群系列 2核4GB
简介: Hello,大家好,我是阿粉,今天是周六,你是在放假还是跟阿粉一样在加班呢?今天的课题是跟大伙聊聊数据表的优化问题,这个问题小伙伴们在工作应该会遇到而且在面试中还经常会问到。

Hello,大家好,我是阿粉,今天是周六,你是在放假还是跟阿粉一样在加班呢?今天的课题是跟大伙聊聊数据表的优化问题,这个问题小伙伴们在工作应该会遇到而且在面试中还经常会问到。

我们都知道当 MySQL 中的表很大的时候,我们的查询就会变得很慢,即使是在进行分页查询,使用 count(*) 计算总条数的时候也是很慢,MySQL 的数据一般达到千万级别的时候就会变得很慢,往往这个时候我们就需要进行优化了,那么优化主要从哪几个方面呢?请听阿粉慢慢道来。

控制数据量

对于线上大表进行查询的时候,我们控制允许查询的时间范围,常规的查询其实也不会使用很多数据,我们一般我们限定一个月的时间限制,如果要查询多个月的数据,就进行分月查询,不支持跨多月进行查询,保证系统的稳定。所以一般我们在创建相关业务表的时候都会加上创建时间字段,在数据量很大的情况下,我们就可以根据创建时间字段进行限定查询。

分库分表

从业务上进行分库分表,我们可以根据业务本身的特定将数据进行分库分表的存储,在查询的时候根据对应的字段或者服务从程序上分库分表查询,也可以使用中间件实现分库分表的查询,这样程序就不用做任何修改,直接实现分库分表查询动作。

分区

除了上面提到的分库分表还是对数据表进行分区,关于分区的内容可以看阿粉之前写的文章面试必问的 MySQL 知识点,你还有哪些没准备好,赶紧收藏脑图 后半部分有提到分区的内容,感兴趣的小伙伴可以去看下,阿粉这里就不重复说明了。分区还可以进行水平分区或者垂直分区,不同的策略对应不同的使用场景,根据需求可以自行选择。

索引优化

对于查询使用较多的字段我们必须设置索引,而且这个索引我们最好再刚开始的时候就考虑到,避免在后续表数据特别大的情况在进行创建索引,这样很不友好这种操作会有线上服务产生影响。其次索引也不是越多越好,创建索引是需要付出代价的,需要有针对性的创建才行,不能盲目创建。

主键索引一定要存在,联合索引的顺序要和查询字段的顺序保持一致,不要使用外键来维护外键关系,通过程序来控制。对于唯一值的列可以增加唯一索引。

SQL 优化

我们在进行查询的时候尽量指定需要查询的列名,不采用select * ,在 SQL 语句中不进行运算操作,在where 条件中避免使用不等于进行查询,容易造成全表扫描。一般情况下对于连续数值判断,采用between 不使用in。在MySQL 中尽量避免使用触发器和函数,相应的功能可以移到程序中进行处理。特别的在进行类型比较的时候,尽量采用相同类型的数据进行比较,不用整型和字符串类型进行比较。

总结

大表优化一直是一个高频的问题,而且在很多场景下都会存在,一个系统经过几年的使用必定会产生相关的大表,这种情况下我们就需要根据实际情况进行优化了。毕竟优化好了,我们 CRUD 起来才会更顺畅!

参考:https://segmentfault.com/a/1190000006158186

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
23天前
|
SQL 关系型数据库 MySQL
大厂面试官:聊下 MySQL 慢查询优化、索引优化?
MySQL慢查询优化、索引优化,是必知必备,大厂面试高频,本文深入详解,建议收藏。关注【mikechen的互联网架构】,10年+BAT架构经验分享。
大厂面试官:聊下 MySQL 慢查询优化、索引优化?
|
4月前
|
存储 Java
【IO面试题 四】、介绍一下Java的序列化与反序列化
Java的序列化与反序列化允许对象通过实现Serializable接口转换成字节序列并存储或传输,之后可以通过ObjectInputStream和ObjectOutputStream的方法将这些字节序列恢复成对象。
|
28天前
|
存储 算法 Java
大厂面试高频:什么是自旋锁?Java 实现自旋锁的原理?
本文详解自旋锁的概念、优缺点、使用场景及Java实现。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
大厂面试高频:什么是自旋锁?Java 实现自旋锁的原理?
|
1月前
|
存储 缓存 Java
大厂面试必看!Java基本数据类型和包装类的那些坑
本文介绍了Java中的基本数据类型和包装类,包括整数类型、浮点数类型、字符类型和布尔类型。详细讲解了每种类型的特性和应用场景,并探讨了包装类的引入原因、装箱与拆箱机制以及缓存机制。最后总结了面试中常见的相关考点,帮助读者更好地理解和应对面试中的问题。
52 4
|
2月前
|
算法 Java 数据中心
探讨面试常见问题雪花算法、时钟回拨问题,java中优雅的实现方式
【10月更文挑战第2天】在大数据量系统中,分布式ID生成是一个关键问题。为了保证在分布式环境下生成的ID唯一、有序且高效,业界提出了多种解决方案,其中雪花算法(Snowflake Algorithm)是一种广泛应用的分布式ID生成算法。本文将详细介绍雪花算法的原理、实现及其处理时钟回拨问题的方法,并提供Java代码示例。
84 2
|
2月前
|
JSON 安全 前端开发
第二次面试总结 - 宏汉科技 - Java后端开发
本文是作者对宏汉科技Java后端开发岗位的第二次面试总结,面试结果不理想,主要原因是Java基础知识掌握不牢固,文章详细列出了面试中被问到的技术问题及答案,包括字符串相关函数、抽象类与接口的区别、Java创建线程池的方式、回调函数、函数式接口、反射以及Java中的集合等。
32 0
|
4月前
|
Java C++
【Java基础面试十七】、Java为什么是单继承,为什么不能多继承?
这篇文章讨论了Java单继承的设计原因,指出Java不支持多继承主要是为了避免方法名冲突等混淆问题,尽管Java类不能直接继承多个父类,但可以通过接口和继承链实现类似多继承的效果。
【Java基础面试十七】、Java为什么是单继承,为什么不能多继承?
|
4月前
|
存储 安全 Java
这些年背过的面试题——Java基础及面试题篇
本文是技术人面试系列Java基础及面试题篇,面试中关于Java基础及面试题都需要了解哪些内容?一文带你详细了解,欢迎收藏!
|
4月前
|
XML 存储 JSON
【IO面试题 六】、 除了Java自带的序列化之外,你还了解哪些序列化工具?
除了Java自带的序列化,常见的序列化工具还包括JSON(如jackson、gson、fastjson)、Protobuf、Thrift和Avro,各具特点,适用于不同的应用场景和性能需求。
|
4月前
|
Java
【Java基础面试三十七】、说一说Java的异常机制
这篇文章介绍了Java异常机制的三个主要方面:异常处理(使用try、catch、finally语句)、抛出异常(使用throw和throws关键字)、以及异常跟踪栈(异常传播和程序终止时的栈信息输出)。