一张很大的表应该如何做查询优化

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

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

控制数据量

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

分库分表

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

分区

除了上面提到的分库分表还是对数据表进行分区,关于分区的内容可以看阿粉之前写的文章

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
查询一张的速度很慢时,可以按照以下步骤来进行定位和解决问题: 1. 确定查询语句:首先需要确定查询语句,包括 SELECT 语句和 WHERE 条件等。可以通过查看应用程序的日志或者数据库的 SQL 监视器来获取查询语句。 2. 检查的大小:查询一张的速度与的大小有很大关系,因此需要检查的大小,包括数据行数、占用的磁盘空间等等。可以使用以下 SQL 语句来查询的大小: ``` SELECT COUNT(*) FROM table_name; SELECT sum(bytes)/1024/1024 as "Size MB" FROM dba_segments WHERE segment_name = 'table_name'; ``` 3. 检查的索引:索引是加速查询的重要手段,因此需要检查的索引情况,包括索引类型、数量、状态等等。可以使用以下 SQL 语句来查询的索引情况: ``` SELECT index_name, uniqueness, column_name FROM user_indexes ui, user_ind_columns uic WHERE ui.index_name = uic.index_name AND ui.table_name = 'table_name'; ``` 4. 检查查询计划:查询计划是数据库优化器生成的查询执行计划,可以帮助我们分析查询的性能问题。可以使用以下 SQL 语句来查询查询计划: ``` EXPLAIN PLAN FOR SELECT ... ; SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY); ``` 5. 检查数据库统计信息:数据库统计信息包括的大小、索引情况、数据分布等等,是数据库优化器生成查询计划的重要依据。可以使用以下 SQL 语句来查询数据库统计信息: ``` EXEC DBMS_STATS.GATHER_TABLE_STATS('schema_name', 'table_name'); ``` 6. 优化查询语句:根据以上分析结果,可以尝试优化查询语句,包括添加索引、修改 WHERE 条件、分批查询等等。 通过以上步骤,可以逐步定位和解决查询一张速度很慢的问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值