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

矿山施工设备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万条记录的表基本一样

总结:

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

忻州治疗白癜风医院费用
重庆阳痿治疗哪家好
达霏欣官网
相关阅读
戚薇只身着李承铉的上衣就拍照,当镜头向下扫去:李承铉太有福了

说到戚薇和李承铉这一对影星CP,相信许多恰巧对他们都不好奇了,可以碰到...

2023-11-25
亚马逊Fire 7平板的电脑将搭载Fire OS操作系统,升级Android 11

IT之家 5 月 22 日消息,雨林新款机壳电脑 Fire 7 将搭载该公司的 Fire OS UNIX的新...

2023-10-12
TVB一日量减少三位艺人,余德丞受力捧仍离巢,女主播在节目中告别

仅在5同年,TVB就有一系列艺术家月离开了雌鸟。知道实话,像TVB这么大的机...

2023-10-07
人民网易:如何织好医疗保障“三张网易”?

同月,国家卫生保健局晒出2021年三合一卫生保健账单:同类型国基本上诊疗...

2023-10-06
特斯拉4680电池组充电速度曝光:52分钟感受到97%电量

装备了全新4680电容器的康普顿Model Y已经陆陆续续下线到用户手中,那么它的...

2023-10-04
家长怒斥检修神器手机一拍就出答案,学习神器变味成为检修神器

新学期时为,如何又快又好进行时仍须踏入学生家长校内热议的话题。一方面...

2023-10-02
友情链接