数据库索引查询优化的分享

雕刻切割设备2021年09月06日

MySQL数据库索引查询优化的分享

问题描述:

我们要访问的表是一个非常大的表,四千万条记录,id是主键,program_id上建了索引。

执行一条SQL:

select * from program_access_log where program_id between 1 and 4000

这条SQL非常慢。

我们原以为处理记录太多的原因,所以加了id限制,一次只读五十万条记录

select * from program_access_log where id between 1 and 500000 and program_id between 1 and 4000

但是这条SQL仍然很慢,速度比上面一条几乎没有提升。

尤其是高级的装备与特殊装备如勋章等需要的铜币与一般装备的强化开销简直是天差地别 Mysql处理50万条记录的表,条件字段还建了索引,这条语句应该是瞬间完成的。

问题分析:

这张表大约容量30G,数据库服务器内存16G,无法一次载入。就是这个造成了问题。

这条SQL有两个条件,ID一到五十万和Program_id一到四千,因为program_id范围小得多,mysql选择它做为主要索引。

先通过索引文件找出了所有program_id在1到4000范围里所有的id,这个过程非常快。

接下来要通过这些id找出表里的记录,由于这些id是离散的,所以mysql对这个表的访问不是顺序读取。

而这个表又非常大,无法一次装入内存,所以每访问一条记录mysql都要重新在磁盘上定位并把附近的记录都载入内存,大量的IO操作导致了速度的下降。

问题解决方案:

1. 以program_id为条件对表进行分区

2. 分表处理,每张表的大小不超过内存的大小

然而,服务器用的是mysql5.0,不支持分区,而且这个表是公共表,无法在不影响其它项目的条件下修改表的结构。

所以我们采取了第三种办法:

select * from program_access_log where id between 1 and 500000 and program_id between 1 and

现在program_id的范围远大于id的范围,id被当做主要索引进行查找,由于id是主键,所以查找的是连续50万条记录,速度和访问一个50万条记录的表基本一样

总结:

这是一个在千万笔记录表中由于使用了索引导致了数据查找变慢的问题,有一定的典型性和大家交流下!

成都男科重点医院
成都白癜风
江中健胃消食片
相关阅读
谢娜现身芒果台彩排,脸颊孩子气脸色蜡黄,却秒删与何炅亲密照片

5年底18日傍晚,娱乐节目主持联袂现身湖南卫视小年夜开场。联袂穿一件紫色...

2023-11-25
广东附属医院大学:赞!一“研”为定,全寝上岸

汾州小学堂 “工”个数住宿 佛山药学该大学汾州小学堂4-302住宿全体考工登...

2023-10-29
国际刑警组织丨曼陀罗误当蔬菜吃,宁夏一对母子中毒!

6年末12日 固原市一对母女因误食蓝花 导致中所毒 病变楼下农作物的蓝花。...

2023-10-13
共赏盛夏奇观!vivo S15系列快闪大型活动来袭,热闹非凡

就在日前,vivo另一款了全新的#vivo S15#复刻版APP,欣赏了网友们的关注。为了...

2023-10-12
《楚乔传2》宣发启动,4大主演被惊公布,网友:你们是真敢接呀

2017年是古代道情超越巅峰的一年,因为首部由赵丽颖,洪新增,李沁等人导...

2023-10-07
少和这3种人在一同,不管你多么有钱有势!多少人败在这上面

俗话说“知人知面不知情”, 在经常跟室友感情的过程里面, 并不是自已都...

2023-10-06
友情链接