`

对拥有一个几十万行表的 MySQL 性能优化的简单办法

阅读更多
对拥有一个几十万行表的 MySQL 性能优化的简单办法
Tutorial徐永久 发表于 2005年05月12日 00:30。  

数据库的优化大概是在系统管理中最具有挑战性的了,因为其对人员的素质要求几乎是全方面的,好的 DBA 需要各种综合素质。在排除了操作系统,应用等引起的性能问题以外,优化数据库最核心的实际上就是配置参数的调整。本文通过一个简单的参数调整,实现了对拥有一个几十万行表的 group by 优化的例子。通过这个简单的调整,数据库性能有了突飞猛进的提升。
本例子是针对 MySQL 调整的,不像其他商业数据库,MySQL 没有视图,特别是 Oracle 可以利用固化视图来提升查询性能,没有存储过程,因此性能的调整几乎只能通过配置合适的参数来实现。

调整的具体步骤(例子针对 pLog 0.3x 的博客系统):

发现最多的 slow log 是:
SELECT category_id, COUNT(*) AS 'count' FROM plog_articles WHERE blog_id = 2 AND status = 'PUBLISHED' group by category_id;
一般在 20s 以上,甚至 30s 。
而当 blog_id=1 或者其他时,都能很快的选出结果。
于是怀疑索引有问题,重新建立索引,但无济于事。 EXPLAIN 结果如下:
mysql> EXPLAIN SELECT category_id, COUNT(*) AS 'count' FROM plog_articles WHERE blog_id = 2 AND status = 'PUBLISHED' group by category_id;
+---------------+------+------------------+------------------+---------+-------------+------+----------------------------------------------+
| table | type | possible_keys | key | key_len | ref | rows | Extra |
+---------------+------+------------------+------------------+---------+-------------+------+----------------------------------------------+
| plog_articles | ref | idx_article_blog | idx_article_blog | 5 | const,const | 4064 | Using where; Using temporary; Using filesort |
+---------------+------+------------------+------------------+---------+-------------+------+----------------------------------------------+
1 row in set (0.00 sec)

于是想到每次查看 blog_id = 2 的博客时,系统负载就提高,有较高的 swap 。于是查看 temporary table 有关的资料,果然有这样的说法:

If you create a lot of disk-based temporary tables, increase the size of tmp_table_size if you can do so safely. Keep in mind that setting the value too high may result in excessive swapping or MySQL running out of memory if too many threads attempt to allocate in-memory temporary tables at the same time. Otherwise, make sure that tmpdir points to a very fast disk that's not already doing lots of I/O.
Another problem that doesn't show up in the slow query log is an excessive use of disk-based temporary tables. In the output of EXPLAIN, you'll often see Using temporary. It indicates that MySQL must create a temporary table to complete the query. However, it doesn't tell you whether that temporary table will be in memory or on disk. That's controlled by the size of the table and MySQL's tmp_table_size variable.
If the space required to build the temporary table is less than or equal to tmp_table_size, MySQL keeps it in memory rather than incur the overhead and time required to write the data to disk and read it again. However, if the space required exceeds tmp_table_size, MySQL creates a disk-based table in its tmpdir directory (often /tmp on Unix systems.) The default tmp_table_size size is 32 MB.
To find out how often that happens, compare the relative sizes of the Created_tmp_tables and Created_tmp_disk_tables counters:

调整 tmp_table_size为 80M 左右后,以上语句 14s 即可解决。

这个参数是 DBA 很容易忽视的。

其实,不单单是数据库,就是操作系统,也是受 tmp 的影响巨大,例如安装软件到 d: 盘,如果 TMP 环境变量指向 c: 盘,而 c: 空间不够,照样可能导致安装失败。

因此让 TMP 有足够的空间可以说是计算机系统里一个普遍适用的原则(写程序也是一样)。
分享到:
评论

相关推荐

    MySQL30W测试数据

    在这个场景下,30W代表有三十万条数据,这是一份用于测试的数据库样本,可以用来检验数据库在处理大量数据时的效率、稳定性以及查询性能。 首先,我们要了解MySQL是一个开源的关系型数据库管理系统,广泛应用于各种...

    【MySQL数据库】一条SQL语句为什么执行这么慢?

    【MySQL数据库】一条SQL语句执行慢的问题是一个复杂的议题,涉及到多个方面,包括数据库的内部机制、事务处理、索引优化以及SQL语句的设计。下面将深入解析导致SQL执行变慢的主要因素。 **一、执行偶尔变慢** 1. *...

    MySQL 快速删除大量数据(千万级别)的几种实践方案详解

    笔者最近工作中遇见一个性能瓶颈问题,MySQL表,每天大概新增776万条记录,存储周期为7天,超过7天的数据需要在新增记录前老化。连续运行9天以后,删除一天的数据大概需要3个半小时(环境:128G, 32核,4T硬盘),而...

    查询效率提升10倍!3种优化方案,帮你解决MySQL深分页问题.doc

    当查询第 10000 页的时候,查询效率急剧下降,执行时间变成了 0.16 秒,性能至少下降了几十倍。 知识点: 4. 回表查询流程:需要扫描前 10 条数据,数据量较大,比较耗时;create_time 是非聚簇索引,需要先查询出...

    sql语句优化心得

    然而,随着业务规模的扩大,特别是当数据量增加至几十万乃至数百万条时,SQL语句的性能问题就会变得尤为突出。因此,掌握一些SQL性能优化技巧对于提升系统的整体性能至关重要。 #### MySQL慢查询日志配置与分析 ...

    系统优化方案.docx

    具体的调优策略和技术细节请参考《Mysql性能调优.docx》。 #### 四、Tomcat调参 针对Tomcat服务器的配置优化也是提升系统性能的关键步骤之一。具体的调优指南请参考《tomcat6性能调优.docx》。 #### 五、...

    MYSQL介绍及培训.pdf

    3. **强大的扩展性**:MySQL支持简单的水平扩展,可组成由数十至数千台服务器的集群,以应对大规模用户访问压力。 4. **代码安全性**:开源特性使得MySQL的漏洞可以迅速被发现和修复,同时源代码的开放性降低了潜在...

    数据库删除数据太慢

    - **实现方式**:在表设计阶段添加一个表示删除状态的字段,通常为布尔类型或枚举类型。当需要删除某条记录时,只需修改该字段的值即可。 3. **优化索引**: - **索引选择**:合理选择索引字段,避免使用频繁更新...

    115 案例实战:数十亿数量级评论系统的SQL调优实战(1).pdf

    如果商品评论有几十万条,这将造成几十万次回表操作,尽管每次回表在聚簇索引中查找较快,但整体耗时仍然显著。之后,对筛选出的数据进行倒序排序,再利用`LIMIT`获取第5001页的20条评论,这个过程可能需要1到2秒的...

    Java使用JDBC向MySQL数据库批次插入10W条数据(测试效率)

    在示例代码中,我们创建了一个`PreparedStatement`对象,预编译了SQL插入语句,然后在循环中填充参数并调用`addBatch()`将每条数据添加到批处理队列中。最后,通过`executeBatch()`一次性执行所有待插入的数据。 ...

    百万级测试数据,共四百三十多万条数据,可用作测试

    标题中的“百万级测试数据”指的是一个包含大量条目的数据集,总计四百三十多万条。这样的数据集通常用于在软件开发过程中验证和优化应用程序的功能,确保其在处理大规模数据时能正常工作。测试数据是模拟真实世界...

    Greenplum内核技术优化解读.pptx

    4. **性能优化**:通过内核升级,Greenplum 6.0实现了高达70倍的TP性能提升,例如SELECT操作达到14万/s,INSERT达到4.6万/s,UPDATE达到2.4万/s。这得益于一系列优化措施,如AOCO(Append-Optimized Columnar)列存...

    asp十万级数据分页方法 长文章分页方法

    6. **优化性能**:为了处理十万级数据,还可以采取以下优化措施: - 使用索引:确保用于分页的关键字段(如ID)有合适的索引,提高查询效率。 - 缓存数据:对于不常变化的数据,可以考虑缓存结果,减少数据库访问...

    在excel的一个sheet中导出大批量数据>20万

    标题中的“在excel的一个sheet中导出大批量数据>20万”指的是处理Excel电子表格时,涉及到大量数据(超过20万个单元格)的导出操作。在Excel中,通常20万条数据可能超过了单个工作表的推荐限制,这可能会导致性能...

    MySQL高级DBA之路

    DBA进阶之路是一个漫长的历程,从入门级DBA到高级甚至专家级DBA,需要逐步增强对数据库系统、操作系统、中间件等多方面知识的了解,同时还需要有扎实的运维经验和丰富的指标模型。在这个过程中,DBA需要学会如何分析...

    腾讯金融级数据库TDSQL分析

    它不仅在技术架构上具备良好的可扩展性和容错性,还在性能和可用性方面进行了大量优化,是金融领域的一个可靠选择。随着金融行业的不断进步,TDSQL也将不断地进行技术和功能上的升级,以满足更加复杂的业务场景。

    大厂面试系列二.pdf

    在实践中优化MySQL,可以考虑诸如合理设计索引、优化查询语句、调整服务器参数、使用缓存、分区表、读写分离等方法。 设置索引但无法使用的情况通常发生在查询条件中有函数或表达式操作,或者在联合索引中,查询...

    03开源NewSql数据库TiDB-Deep Dive into TiDB

    在这一版本中,SQL 执行引擎引入新的内部数据表示方式 --- `Chunk`,一个结构中保存一批数据而不仅是一行数据,同一列的数据在内存中连续存放,使得内存使用更紧凑,这样带来了几点好处:1. 显著减小了内存消耗; 2....

    loadData批量导入以及压缩协议使用指南1

    MySQL的`LOAD DATA INFILE`语句是一种高效的数据批量导入方法,它的性能通常是单条`INSERT`语句的几十倍,特别适用于大数据量的导入。从Mycat 1.4版本开始,它开始支持MySQL的压缩协议,这对于处理大量数据和大结果...

    基于微信小程序的校园服务平台的设计与开发.pdf

    4. 用户规模与服务反馈:文档提到了该校园服务平台已有几十万的曝光量和两万的用户规模,这说明平台已经形成了良好的用户基础,并能以优质的服务和功能满足大学生群体的需求。这样的用户规模对于进一步完善平台功能...

Global site tag (gtag.js) - Google Analytics