`

mysql5下大数据量查询优化的问题

阅读更多

一个blog表,目前数据大概90多w,短期内可预见的数据量会是200w以内。

一个user表,目前数据大概2000w,短期内可预见数据量在3000w以内。

 

其中blog表有userid做外键,与user表的主键id关联。同时有manager字段,代表审核状态,分别为0、1、2。预计0的记录非常少,1的记录相对较少,2的比较非常多。createTime 字段为数字型,保存unix时间戳。

 

而实际查询中的SQL为

FROM blog AS m INNER JOIN user as s ON m.userID = s.ID WHERE m.manager = 2 ORDER BY m.ID DESC

 

优化的手段包括:

1、使用innodb引擎

2、对blog表做hash分区,分区字段为主键ID

3、对user表做hash分区,分区字段为主键ID

4、查询时加入时间条件限制范围

5、对manager和createTime做联合索引

 

最终的SQL为:

FROM blog AS m INNER JOIN user as s ON m.userID = s.ID WHERE m.manager = 2 AND m.createTime >= ? AND m.createTime <= ? ORDER BY m.ID DESC LIMIT 0,20

 

即使如此,涉及的数据量也在20w以内。因此这条SQL会卡死mysql服务。求优化方法。。。

分享到:
评论
18 楼 nihongye 2008-08-13  
那就是了,20万数据做like,开销很大。
你可以考虑跟title做联合索引,时间跟文本的联合索引很占空间 ; 或是在title做独立索引,并指定使用title上的索引.总之保证尽可能的少读取数据。
explain的结果rows列列出了需要验证的记录数,每一行的记录数相乘是总的记录数。
17 楼 eason007 2008-08-13  
nihongye :explain的结果也是使用manager上的联合索引。毕竟title没有做索引。

weishuwei :
原来就是单独索引的,但速度更慢。

内联结会使结果数据相对准确一些。
16 楼 weishuwei 2008-08-13  
(1)不建议做联合索引,建议分别做索引
(2)不知道你为啥要用内链接,从你的业务需求上貌似没这种必要,可以考虑用外连接.
(3)程序的事务处理是否有合理
15 楼 nihongye 2008-08-13  
你对title,like啊。explain 出来什么?
14 楼 eason007 2008-08-13  
from blog, user where blog.userID=user.id and blog.manager=2  and blog.createTime <=1218613810 and blog.createTime >=1218009010 and blog.title like '随%'
order by blog.createtime desc  limit 0,20

耗时21多s
13 楼 eason007 2008-08-13  
现在又出现这个问题了。
12 楼 eason007 2008-08-13  
Innodb_buffer_pool_reads          | 27193
Innodb_buffer_pool_read_requests  | 1270213
11 楼 nihongye 2008-08-13  
没有orderby加上limit,按理来说,只会出现很少的磁盘读了。不清楚为什么出现你说的现象。
另外用mysqladmin extended-status检查
Innodb_buffer_pool_reads / Innodb_buffer_pool_read_requests的比例是否小于1/100.
10 楼 eason007 2008-08-13  
回nihongye :是用manager和createtime的索引没错。去掉order by的话,加上limit也是卡死

回Lucas Lee :有加limit的。顶楼的我只是说即使加入时间条件,也会在大概20w以内的数据进行排序。


但今天回来再测试发现查询不会卡死进程,只是稍有延迟。不知道是不是因为昨天在测试前进行大量的数据导入所致。
9 楼 LucasLee 2008-08-13  
我觉得这个问题的关键暂时不在如何优化SQL本身--而在于逻辑:
为什么需要查出这20W条记录?
查出来再做什么处理?
是做统计汇总,还是直接显示给用户?
如果是后者,则需要加入分页逻辑。
8 楼 nihongye 2008-08-13  
先明确一下,explain后,key是否用了manager跟createtime的联合索引?
如果是,去掉orderby,加上limit 0,10,如果这样很快,就说明可能是读取数据多时过多的磁盘io,
查看数据库的状态,有两个变量说明innodbbuffer的命中情况的。
7 楼 eason007 2008-08-13  
优化filesort只能调mysql配置吗?

试过去掉order by ,结果一样的。
6 楼 nihongye 2008-08-12  
试了一下,createTime是一个range查询,跟id做联合索引后,没办法消除掉filesort。
manger跟id做联合索引,并优先使用它们的联合索引则可以消除filesort,但这样没用到createTime索引,开销可能更大。
大批量的数据加载的开销很大,你先看下去掉orderby是否能达到要求,然后再针对fielsort优化。
5 楼 eason007 2008-08-12  
楼上的意思是加联合索引?

blog表的外键userID有单独索引,关联字段的ID是主键,也有独立索引。而条件中的manager和createTime有联合索引。

楼上的意思是把主键id也加入到manager的联合索引中?
4 楼 nihongye 2008-08-12  
先尝试优化掉filesort,见
http://nihongye.iteye.com/admin/blogs/193442,

http://dev.mysql.com/doc/refman/5.0/en/order-by-optimization.html。
3 楼 eason007 2008-08-12  
nihongye 写道
引用
即使如此,涉及的数据量也在20w以内。

什么意思?
执行explain,出来什么?


我的意思是说即使最后加上时间条件,只查7天内的数据,也有20w以内的记录。

执行explain的话,大概出现的内容:
blog,使用manager上的索引,最后一列有filesort
user,使用主键索引。
2 楼 nihongye 2008-08-12  
引用
即使如此,涉及的数据量也在20w以内。

什么意思?
执行explain,出来什么?
1 楼 eason007 2008-08-12  
本来想blog表是用createTime做rang分区的,但这样的话blog表就不能有主键和外键。而且没有主键的话,使代码相对复杂一点去生成主键。当然,用uid也可以,不过不想用。

而hash分区好象没办法再做复合分区。

相关推荐

    MySQL海量数据查询优化策略.

    18. 限制返回的数据量:使用LIMIT来减少返回给客户端的数据量可以减轻服务器负载,并且提高查询响应速度。 19. 避免使用SELECT *:在只需要部分列时,应当明确指出需要哪些列,减少数据传输的量。 20. 考虑事务的...

    mysql大数据量优化

    MySQL数据库在处理大数据量时,性能优化至关重要。以下是一些关键的优化策略和技术: 1. **连接查询与子查询优化**: - **连接查询**(JOIN):当需要从多个表中获取关联数据时,使用连接查询通常比子查询更有效率...

    如何统计MySQL数据量大小

    在数据库管理中,了解MySQL数据量的大小是至关重要的,这有助于优化性能、规划存储空间以及进行容量规划。本文将详细讲解如何统计MySQL数据库的数据量大小,并涉及CONCAT函数的解读,以及对information_schema和...

    C#在MySQL大量数据下的高效读取、写入详解

    本文将探讨如何高效地读取和写入大量数据,主要分为三个步骤:解决读取问题、数据处理和数据插入。 ### 第一步:解决读取问题 1. **避免使用重型ORM框架**:如Entity Framework和NHibernate,这些框架在处理大数据...

    MySQL大数据量分页查询方法及其优化

    ### MySQL大数据量分页查询方法及其优化 在处理大规模数据集时,MySQL的分页查询是非常常见的需求之一。为了提高查询效率,减少响应时间和资源消耗,开发者需要掌握多种不同的分页查询方法及其优化技巧。本文将详细...

    MySQL百万级数据量分页查询方法及其优化建议

    在MySQL中,面对百万级数据量的分页查询,如何高效地进行操作并优化查询性能是数据库管理员和开发人员必须关注的问题。以下是一些常用的方法和优化建议: 1. **直接使用LIMIT语句**:这是最基础的分页查询方式,如`...

    mysql高级优化查询

    根据提供的文件信息,我们可以深入探讨 MySQL 的高级优化查询这一主题,包括其查询缓存原理以及 MySQL 的内部机制等核心知识点。 ### 一、MySQL 查询缓存原理 #### 1.1 什么是查询缓存 查询缓存是 MySQL 中用于...

    MySQL索引原理及慢查询优化1

    MySQL索引原理及慢查询优化是数据库管理中的重要主题,尤其是在高并发、大数据量的互联网环境中,优化查询性能对于系统的整体效能至关重要。MySQL作为广泛使用的开源关系型数据库,其索引机制和查询优化技巧是开发者...

    mysql 千万级数据优化

    下面我们将从查询优化和 SQL 编写注意事项两个方面来讨论 MySQL 千万级数据优化。 查询优化 1. 尽量避免全表扫描,首先应考虑在 WHERE 及 ORDER BY 涉及的列上建立索引。这是因为索引可以帮助 MySQL 快速定位数据...

    大数据量测试数据(MySQL)

    在这个主题中,我们关注的是如何利用MySQL进行大数据量的测试和优化。提供的压缩包文件包含了一系列的SQL脚本和数据备份,用于创建表格、导入数据并进行性能测试。 首先,`employees.sql` 文件是核心,它包含了创建...

    mysql优化笔记+资料

    3. 分区表和分片技术可以提高大数据量下的查询性能。 四、存储引擎选择 InnoDB存储引擎支持事务处理和行级锁定,适合并发环境;MyISAM则速度快,但不支持事务,适合读多写少的场景。 五、服务器配置优化 1. 调整...

    30个mysql千万级大数据SQL查询优化技巧详解

    通过遵循以上技巧,可以显著提升大数据量场景下的MySQL查询性能。记住,每个数据库的使用环境和需求都不同,因此在优化时要结合实际情况进行调整。持续监控查询性能,根据需要调整索引和查询逻辑,是保证数据库高效...

    Mysql 百万级数据优化资料

    从给定的文件标题、描述、标签以及部分内容中,我们可以提炼出关于MySQL百万级数据优化的关键知识点,这些知识点涵盖了系统架构、硬件选择、文件系统、应用程序接口(API)、查询优化等多个方面,对于处理大规模...

    mysql200万条大数据量测试sql文件

    mysql200万+条大数据量测试sql文件,可以用于测试服务器数据库性能,学习sql性能优化和调优。资源是.sql文件压缩后上传。用navicat导入实测用时几分钟时间,数据量200W+条。快速获取百万级真实测试数据。

    mysql数据库In的优化.txt

    当涉及到大量数据时,如何有效地使用`IN`子句成为了提高查询性能的关键。本文将详细介绍如何针对`IN`子句进行优化,并通过一个具体的例子来展示其优化过程。 #### 二、`IN`子句的基本概念与应用场景 1. **基本概念...

    mysql优化提高百万条数据的查询速度[参考].pdf

    14. 并不是所有索引对查询都有效,SQL是根据表中数据来进行查询优化的,当索引列有大量数据重复时,SQL查询可能不会去利用索引。 15. 索引并不是越多越好,索引固然可以提高相应的select的效率,但同时也降低了...

Global site tag (gtag.js) - Google Analytics