mysql数据表规模九千万左右,怎么优化查询?
mysql数据表规模九千万左右,怎么优化查询?
-----
网友解答:
-----
我们表又3000万数据,可是产品的需求总是很难走索引,比如要计算分页,比如时间索引,但是产品又会让时间跨度很大。后端提过建议,历史数据拆分出去单独查询,也不允许[流泪][流泪]
-----
网友解答:
-----
我的天啦,一个表九千万也是了不得了!
我上家公司明确规定,一张表不能超过5000万,因为查询效率会有更大的降低!
无论如何,看下如何优化数据查询吧!
①,单库单表:
1,加索引,一个好的索引能用空间换取查询时间的大为降低!
2,使用存储过程:减少sql编译的时间!
3,优化sql:包括联合查询的指向,where,order语句使用索引字段,减少使用多表联合查询,不要使用select *等等!
4,参数配置:扩大内存,调节线程池参数等等!
5,开启缓存:开启二级缓存,三级缓存,提升查询效率!
②,单库多表:
使用水平拆分(比如按月份),将表分为12张表,然后在代码端按照月份访问相应月份的表!
使用垂直拆分:很多字段只是作为保存记录用,(像一些约定,备注啥的字段往往很大),可以将查询中常常用到的字段放在常用的一张表中做查询,另一些字段放另一张表中存储,通过某个唯一索引字段联系起来,可以保证查询效率大为提升(因为磁盘IO减少)!
③,多库多表:
①,主从读写分离:表中数据虽然还是一致,但是由于多个从库读,主库写数据,大大减少共享锁的性能开销!
②,分库分表:指定一个字段作为,分库字段,利用hash值或者其它策略,分布在不同的库里面,在按照相应分布策略(比如上面的水平拆分或者垂直拆分),分散到不同的表里!
比如我们现在的数据库设计为8库1024表,你的将近一亿的数据在我们的单张表里面只有不到10W!
虽然理论上,一张表的大小不做任何限制,但是基于查询效率,索引性能等,不宜超出5000万数据!
关于多线程,分布式,微服务,数据库,缓存的更多干货,会继续分享,敬请关注。。
-----
网友解答:
-----
实践出真知。根据成本顺序依次是:
第一:加索引优化sql。尽量避免全盘扫描,另单表索引也不是越多越好。
第二:加缓存。使用redis,memcached,但注意缓存同步更新、设置失效等问题。
第三:主从复制,读写分离。适合读多写少的场景,同步会有延迟。
第四:垂直拆分。可以选用适当的中间件Mycat等
第五:水平切分。选择合理的sharding key,改动表结构,将大数据字段拆分出去,对经常查询的字段做一定的冗余,同时做好数据同步。
当然还有优化数据库连接配置,根据业务选用不同的数据库引擎等等。
我是一名架构师,欢迎关注,给技术加点料
-----
网友解答:
-----
我不清楚答题的大部分人是否有真正实践过,特别是用mysql实践过。大部分说是加索引、调整参数不是说不正确,有效果,但是不能很好的解决问题。说说个人想法:
部分答主的方案的确不敢苟同,纠正如下:
1、select count(*) 和 select count(主键) 在现阶段的mysql 没有太大区别,新版mysql这个对性能影响可以忽略。
2、强烈反对使用存储过程,后面介绍了使用分表分库的方案,就更不要用存储过程了。
3、单表行数和表数量,需要找到平衡点。表太多,性能也会下降。
我的回答:
1、单表9000w数据,mysql存储不了,想办法分表分库。500w数据的时候,你就该有这个想法了。只加索引解决不了问题,9000w的单表数据,很难平衡查找和插入性能,索引稍微多了插入性能也很低。
2、不要再说select count了,放弃汇总查询的想法,根本查不了。
3、数据最终以mysql作为主要存储,考虑最终查询的数据源放在非关系的数据存储上,mongo,es都可以考虑下。
4、业务场景都是需要实时查询9000w数据吗?非实时数据,可以考虑hadoop系大数据方案。
5、最后说下,mysql 和oracle,sql server不一样,不一样。
-----
网友解答:
-----
读写分离,分库分表,热数据放内存。
读写分离:减少写库所带来的行锁甚至表锁对查询的影响,提升查询效率,同时还可以保证高可用。
在设计系统之初就设计好垂直分库和垂直分表,比如垂直分表:在一张大表中,一些热数据的字段放在一起,一些不常用的而且占用空间比较大的字段放在另外一张表,这样子做的好处是提升了查询速度,因为mysql是以页存储数据的,一页之中存放的数据越多,查询效率会更高。
另外再配合redis mongodb这些缓存数据库,热数据放进去,查询效率会进一步得到提升。
如果上面的方案还无法解决查询缓慢的问题,可能是因为我们的数据量非常大,而且持续快速增长。我们还可以进行水平分库分表,例如把一张1亿数据量的大表,水平拆分成10张相同的大表,再水平拆分到10个不同的数据库中。。。
觉得可以的点个赞
------------------
推荐阅读:
职场中,你遇到过哪类让你反感的人?作的、两面三刀的还是扮猪吃老虎的?
有人要死了,我不是医生可以治好他,我会因非法行医受到罚款吗?
在《遮天》黑暗动乱的时候,如果那个时候青帝不在荒塔里面,而是还在世!会怎样?
我是全日制已毕业大专生。现在想考一个本科学历,然后有机会去考公务员,选择自考还是成考比较有优势呢?