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

2016-02-19 19:49 2 1 收藏

只要你有一台电脑或者手机,都能关注图老师为大家精心推荐的MySQL数据库索引查询优化的分享,手机电脑控们准备好了吗?一起看过来吧!

【 tulaoshi.com - 编程语言 】

  问题描述:

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

(本文来源于图老师网站,更多请访问https://www.tulaoshi.com/bianchengyuyan/)

  执行一条SQL:

  select * from program_access_log where program_id between 1 and 4000

  这条SQL非常慢。

(本文来源于图老师网站,更多请访问https://www.tulaoshi.com/bianchengyuyan/)

  我们原以为处理记录太多的原因,所以加了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万条记录的表基本一样

  总结:

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

来源:https://www.tulaoshi.com/n/20160219/1621867.html

延伸阅读
标签: MySQL mysql数据库
在优化查询中,数据库应用(如MySQL)即意味着对工具的操作与使用。使用索引、使用EXPLAIN分析查询以及调整MySQL的内部配置可达到优化查询的目的。 任何一位数据库程序员都会有这样的体会:高通信量的数据库驱动程序中,一条糟糕的SQL查询语句可对整个应用程序的运行产生严重的影响,其不仅消耗掉更多的数据库时间,且它将对其他应用组件产生...
标签: SQLServer
    与没有数据库的网站相比,数据库的存取会降低你的系统性能。但是大多数情况下,网站和数据库有密不可分的关 系,正是数据库给站点提供了大容量、多样性、个性化等特色,并实现了很多特殊的功能。     1不要忘记给数据库做索引。合理的索引能立即显著地提高数据库整个系统的性能。可以参考有关...
SQL Server数据库查询速度慢的原因有很多,常见的有以下几种: 1、没有索引或者没有用到索引(这是查询慢最常见的问题,是程序设计的缺陷) 2、I/O吞吐量小,形成了瓶颈效应。 3、没有创建计算列导致查询不优化。 4、内存不足 5、网络速度慢 6、查询出的数据量过大(可以采用多次查询,其他的方法降低数据量...
在数据库编程中,管理人员需要经常从数据库中查询数据。当查询条件为确定时,我们可以明确用的SQL语句来实现,但是当查询条件为多个条件的动态组合时,查询语句会由于分支太多及IF语句的多重嵌套而变得相当复杂。在此,笔者提供了一种优化方法,运用本方法可以有效地减少查询语句的分支和数量以及IF条件语句的嵌套层数,从而提高程序的运行...
标签: SQLServer
关于索引的常识:影响到数据库性能的最大因素就是索引。由于该问题的复杂性,我只可能简单的谈谈这个问题,不过关于这方面的问题,目前有好几本不错的书籍可供你参阅。我在这里只讨论两种SQL Server索引,即clustered索引和nonclustered索引。当考察建立什么类型的索引时,你应当考虑数据类型和保存这些数据的column。同样,你也必须考虑数据库...

经验教程

294

收藏

81
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部