`
freezzj
  • 浏览: 992 次
  • 性别: Icon_minigender_1
  • 来自: 北京
最近访客 更多访客>>
社区版块
存档分类
最新评论

建立索引查询慢的解决办法

阅读更多
问题描述:


我们要访问的表是一个非常大的表,四千万条记录,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万条记录的表基本一样

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

相关推荐

    sql查询慢的原因,及解决方法

    解决方法是根据查询条件建立索引,优化索引的使用方式。 13. 纵向、横向分割表,减少表的尺寸 解决方法是纵向、横向分割表,减少表的尺寸。 14. 增加服务器 CPU 个数 解决方法是增加服务器 CPU 个数,但是必须明白...

    解决MySql大数据Like查询慢的问题

    本教程将探讨如何解决MySQL大数据量下LIKE查询慢的问题,并介绍一种JAVA模拟LIKE的方法来提升查询效率。 首先,我们需要理解LIKE查询的工作原理。当使用LIKE查询时,如果模式以%开头或结尾,MySQL无法利用索引来...

    SQL Server数据库查询速度慢原因及优化方法

    4、根据查询条件,建立索引,优化索引、优化访问方式,限制结果集的数据量。注意填充因子要适当(最好是使用默认值0)。索引应该尽量小,使用字节数小的列建索引好(参照索引的创建),不要对有限的几个值的字段建单一...

    数据库查询慢的原因总结

    如果查询涉及到的字段没有建立索引,或者索引设计不合理,数据库就需要全表扫描,这会显著降低查询效率。 2. **查询语句复杂度过高**:过度复杂的SQL语句,如多表连接、子查询、嵌套循环等,可能导致执行计划复杂,...

    关于oracle中clob字段查询慢的问题及解决方法

    总结来说,解决Oracle中CLOB字段查询慢的问题,可以采取以下策略: 1. 使用DBMS_LOB包的函数进行部分数据转换和查找。 2. 创建全文索引来加速文本搜索,但需考虑额外的存储和维护成本。 3. 如果可能,优化查询语句,...

    接口响应慢的处理办法-mysql索引不生效情况分析

    为所有可能出现在`OR`条件中的字段建立索引,或重构查询逻辑以避免使用`OR`。 2. **字段类型不匹配** - **问题描述**: 如果字段类型是字符串,但在查询时未使用引号包裹值,则可能导致索引失效。 - **示例**...

    提高ORACLE数据库的查询统计速度

    - **建立合适类型的索引**:根据查询需求选择合适的索引类型(如B树索引、位图索引等)。 - **定期维护索引**:包括重建、分析索引统计信息等操作,保持索引的最佳状态。 - **避免过度索引**:过多的索引会导致更新...

    Win10开始菜单反应慢的解决方法.docx

    Windows 10为了快速搜索文件,会自动建立索引。然而,对于大容量硬盘或大量文件的情况,这可能会消耗大量系统资源。关闭不必要的文件索引可以改善性能: 1. 右键点击开始按钮,选择“控制面板”。 2. 在控制面板中...

    C#程序执行时间长查询速度慢解决方案

    在C#编程中,遇到程序执行时间长,尤其是查询数据库速度慢的问题,通常是由于数据库查询效率低下或资源管理不当导致的。以下是一些针对性的解决方案: 1. **优化数据库查询**: - 分析SQL语句,确保它们是高效的。...

    详解Django的model查询操作与查询性能优化

    索引能够显著提高查询速度,特别是对于大数据集而言,建立适当索引是提高查询效率的重要手段。 7. 对于大数据集的查询,应尽量使用延迟加载,或者分批获取数据,防止一次性加载过多数据而导致查询性能下降。 8. ...

    SQL Server数据查询的优化研究.pdf

    索引建立需遵循一定的原则,例如避免在经常存取的列上建立索引、在查询条件字段上建立索引等。 2. 数据分布统计信息缺失或过时:这些统计信息对于查询优化器来说至关重要,它们可以帮助优化器计算出高效执行计划。 ...

    CPU占用100%解决办法.docx

    12. 视频文件处理:单击 avi 视频文件后 CPU 占用率高是因为系统要先扫描该文件,并检查文件所有部分,并建立索引;解决办法是右击保存视频文件的文件夹-属性-常规-高级,去掉为了快速搜索,允许索引服务编制该...

    SQL2000数据库优化及安全建议.doc

    4. 根据查询条件,建立索引:根据查询条件,建立索引可以提高查询速度。 5. 优化索引:优化索引可以提高查询速度。 6. 限制结果集的数据量:限制结果集的数据量可以提高查询速度。 7. 提高网速:提高网速可以提高...

    MySQL慢SQL语句常见诱因以及解决方法

    虽然很多时候建立了索引,但在一些特定的场景下,索引还有可能会失效,所以索引失效也是导致慢查询的主要原因之一。 2. 锁等待 常用的存储引擎有 InnoDB 和 MyISAM,前者支持行锁和表锁,后者只支持表锁。 如果...

    数据库变慢的解决之道.docx

    - **未正确建立索引**:尽管`user`表中存在`account`字段的唯一索引,但在某些查询中并未有效利用。 - **隐式类型转换**:在SQL语句中,如果查询条件的类型与索引列的类型不匹配,则可能会发生隐式类型转换,导致全...

    替代win 查询慢的小工具 秒现

    描述中提到的“第一次运行建立数据慢一下”,意味着该工具在首次启动时会进行索引构建过程。这一步骤可能会消耗一些时间,因为它需要扫描并记录用户计算机上的所有文件信息,以便后续的快速查询。一旦索引完成,之后...

    PLSQL隔断时间再执行sql的时候卡死未响应(要等很久才有结果)解决办法

    ### PLSQL隔断时间再执行SQL的时候卡死未响应(要等很久才有结果)解决办法 在使用PL/SQL Developer或其他Oracle数据库管理工具时,可能会遇到一个常见的问题:执行SQL语句或存储过程时,系统长时间无响应或者卡住...

    SQL的查询速度优化方法.pdf

    数据库查询速度优化是数据库性能优化领域中的一项关键任务。...通过具体的案例分析和优化实践,证明了合理使用索引、优化连接操作和Where子句,可以显著提高SQL查询速度,解决网络数据库应用中的性能瓶颈问题。

    大量数据库的查询优化及分页算法方案

    解决大量数据库的查询优化及分页算法方案问题需要从多方面入手,包括建立适当的索引结构、优化 SQL 语句、选择合适的索引类型等。只有通过综合的方法,才能提高查询速度,实现快速地从这些超大容量的数据库中提取...

Global site tag (gtag.js) - Google Analytics