Mysql数据库索引查询优化的分享 [转]
来源:互联网 发布:杨浦区人口普查数据 编辑:程序博客网 时间:2024/06/01 09:46
原文地址:http://ourmysql.com/archives/108
我们要访问的表是一个非常大的表,四千万条记录,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 15000000
现在program_id的范围远大于id的范围,id被当做主要索引进行查找,由于id是主键,所以查找的是连续50万条记录,速度和访问一个50万条记录的表基本一样
总结:
这是一个在千万笔记录表中由于使用了索引导致了数据查找变慢的问题,有一定的典型性和大家交流下!
- Mysql数据库索引查询优化的分享
- Mysql数据库索引查询优化的分享
- Mysql数据库索引查询优化的分享 [转]
- mysql数据库索引查询一个优化大数据量的实例的分享
- mysql数据库索引查询一个优化大数据量的实例的分享
- Mysql 数据库查询优化之索引
- 数据库查询优化——Mysql索引
- 数据库查询优化——Mysql索引
- MySQL索引原理及慢查询优化--美团分享
- 美团网技术团队分享的MySQL索引及慢查询优化教程
- MySQL查询优化---索引
- mysql查询索引优化
- mysql查询索引优化
- mysql 查询索引优化
- MySQL 查询 索引 优化
- 一次mysql的查询索引的优化
- 数据库的索引大幅度优化查询速度
- Mysql的索引和查询优化
- URL重写(rewirte)实验
- 4.5 延迟静态绑定:static 关键字 《深入PHP:面向对象、模式与实践》
- 多租户技术 【摘】---共用、隔离
- LVS 的持久连接访问 【摘】
- innodb double write buffer刷单页场景
- Mysql数据库索引查询优化的分享 [转]
- 存储相关介绍
- 跨网站脚本(Cross-site scripting)介绍
- Shell脚本 ---执行脚本前,权限最好chmod a+x filename
- 变量的设置规则
- struts2的核心和工作原理
- 学习shell --script的执行方式区别(source 、 shscript 、./script)
- 6.3重构查询的方式
- MySQL一些函数