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 15000000

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

总结:

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

MySQL查询优化系列讲座之数据类型与效率
     这一部分提供了如何选择数据类型来帮助提高查询运行速度的一些指导:  在可以使用短数据列的时候就不要用长的。如果你有一个固定长度的CHAR数据列,那么就不要让它的长度超出实际需要。如果你在数据列中存...查看完整版>>MySQL查询优化系列讲座之数据类型与效率
 
MySQL查询优化系列讲座之数据类型与效率
  这一部分提供了如何选择数据类型来帮助提高查询运行速度的一些指导:  在可以使用短数据列的时候就不要用长的。如果你有一个固定长度的CHAR数据列,那么就不要让它的长度超出实际需要。如果你在数据列中存储的...查看完整版>>MySQL查询优化系列讲座之数据类型与效率
 
MySQL查询优化系列讲座之数据类型与效率
  这一部分提供了如何选择数据类型来帮助提高查询运行速度的一些指导:  在可以使用短数据列的时候就不要用长的。如果你有一个固定长度的CHAR数据列,那么就不要让它的长度超出实际需要。如果你在数据列中存储的...查看完整版>>MySQL查询优化系列讲座之数据类型与效率
 
MySQL查询优化系列讲座之数据类型与效率
  这一部分提供了如何选择数据类型来帮助提高查询运行速度的一些指导:  在可以使用短数据列的时候就不要用长的。如果你有一个固定长度的CHAR数据列,那么就不要让它的长度超出实际需要。如果你在数据列中存储的...查看完整版>>MySQL查询优化系列讲座之数据类型与效率
 
Informix数据库利用索引提高查询效率
如果查询结果仅为一行或很少几行时(高选择性high selectivity),利用索引进行查询会大大提高效率。相比之下,如果没有索引,查询则只能顺序扫描整个表。在OLTP环境下,事务处理在很大程度上依赖于索引。只有在表很小...查看完整版>>Informix数据库利用索引提高查询效率
 
Mysql数据库管理系统优化方案
首先,为了使一个系统更快,最重要的部分就是基础设计,不过有些东西是现有情况下无法逾越的,比如说系统常见的瓶颈. 我所能想到的: 1:磁盘寻道能力,以高速硬盘(7200转/秒),理论上每秒寻道7200次.这是没有办法改变的,优化...查看完整版>>Mysql数据库管理系统优化方案
 
运用ADO.NET对象优化数据查询代码
  毫无疑问,ADO.NET 向人们提供了一种功能强大、仿真数据库的对象模型,它可以将数据记录保存到内存中。尤其是ADO.net 的 DataSet 类,它不但在功能上相当于数据库表的集中存储器(central repository),而且支持表...查看完整版>>运用ADO.NET对象优化数据查询代码
 
运用 ADO.NET 对象优化数据查询代码
毫无疑问,ADO.NET 向人们提供了一种功能强大、仿真数据库的对象模型,它可以将数据记录保存到内存中。尤其是ADO.net 的 DataSet 类,它不但在功能上相当于数据库表的集中存储器(central repository),而且支持表间的...查看完整版>>运用 ADO.NET 对象优化数据查询代码
 
数据库查询优化
数据库系统是管理信息系统的核心,基于数据库的联机事务处理(OLTP)以及联机分析处理(OLAP)是银行、企业、政府等部门最为重要的计算机应用之一。从大多数系统的应用实例来看,查询操作在各种数据库操作中所占据的比...查看完整版>>数据库查询优化
 
 
回到王朝网络移动版首页