`
lzj0470
  • 浏览: 1270756 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

mysql查询占用内存,优化的技巧

阅读更多
在Apache, PHP, MySQL的体系架构中,MySQL对于性能的影响最大,也是关键的核心部分。对于Discuz!论坛程序也是如此,MySQL的设置是否合理优化,直接影响到论坛的速度和承载量!同时,MySQL也是优化难度最大的一个部分。
在Apache, PHP, MySQL的体系架构中,MySQL对于性能的影响最大,也是关键的核心部分。对于Discuz!论坛程序也是如此,MySQL的设置是否合理优化,直接影响到论坛的速度和承载量!同时,MySQL也是优化难度最大的一个部分,不但需要理解一些MySQL专业知识,同时还需要长时间的观察统计并且根据经验进行判断,然后设置合理的参数。

下面我们了解一下MySQL优化的一些基础,MySQL的优化我分为两个部分,一是服务器物理硬件的优化;二是MySQL自身(my.cnf)的优化。

(1) 服务器硬件对MySQL性能的影响

a) 磁盘寻道能力(磁盘I/O),以目前高转速SCSI硬盘(7200转/秒)为例,这种硬盘理论上每秒寻道7200次,这是物理特性决定的,没有办法改变。 MySQL每秒钟都在进行大量、复杂的查询操作,对磁盘的读写量可想而知。所以,通常认为磁盘I/O是制约MySQL性能的最大因素之一,对于日均访问量在100万PV以上的Discuz!论坛,由于磁盘I/O的制约,MySQL的性能会非常低下!解决这一制约因素可以考虑以下几种解决方案:

使用RAID-0+1磁盘阵列,注意不要尝试使用RAID-5,MySQL在RAID-5磁盘阵列上的效率不会像你期待的那样快; 抛弃传统的硬盘,使用速度更快的闪存式存储设备。经过Discuz!公司技术工程的测试,使用闪存式存储设备可比传统硬盘速度高出6-10倍左右。

b) CPU 对于MySQL应用,推荐使用S.M.P.架构的多路对称CPU,例如:可以使用两颗Intel Xeon 3.6GHz的CPU。

c) 物理内存对于一台使用MySQL的Database Server来说,服务器内存建议不要小于2GB,推荐使用4GB以上的物理内存。

(2) MySQL自身因素当解决了上述服务器硬件制约因素后,让我们看看MySQL自身的优化是如何操作的。对MySQL自身的优化主要是对其配置文件my.cnf中的各项参数进行优化调整。下面我们介绍一些对性能影响较大的参数。

由于my.cnf文件的优化设置是与服务器硬件配置息息相关的,因而我们指定一个假想的服务器硬件环境:

CPU: 2颗Intel Xeon 2.4GHz

内存: 4GB DDR

硬盘: SCSI 73GB

下面,我们根据以上硬件配置结合一份已经优化好的my.cnf进行说明:

# vi /etc/my.cnf
以下只列出my.cnf文件中[mysqld]段落中的内容,其他段落内容对MySQL运行性能影响甚微,因而姑且忽略。

[mysqld]
  port = 3306
  serverid = 1
  socket = /tmp/mysql.sock
  skip-locking
  # 避免MySQL的外部锁定,减少出错几率增强稳定性。
  skip-name-resolve
禁止MySQL对外部连接进行DNS解析,使用这一选项可以消除MySQL进行DNS解析的时间。但需要注意,如果开启该选项,则所有远程主机连接授权都要使用IP地址方式,否则MySQL将无法正常处理连接请求!

back_log = 384
指定MySQL可能的连接数量。当MySQL主线程在很短的时间内接收到非常多的连接请求,该参数生效,主线程花费很短的时间检查连接并且启动一个新线程。

back_log参数的值指出在MySQL暂时停止响应新请求之前的短时间内多少个请求可以被存在堆栈中。 如果系统在一个短时间内有很多连接,则需要增大该参数的值,该参数值指定到来的TCP/IP连接的侦听队列的大小。不同的操作系统在这个队列大小上有它自己的限制。

试图设定back_log高于你的操作系统的限制将是无效的。默认值为50。对于Linux系统推荐设置为小于512的整数。

key_buffer_size = 256M
  # key_buffer_size指定用于索引的缓冲区大小,增加它可得到更好的索引处理性能。    对于内存在4GB左右的服务器该参数可设置为256M或384M。  注意:该参数值设置的过大反而会是服务器整体效率降低!
     max_allowed_packet = 4M
    thread_stack = 256K
    table_cache = 128K
    sort_buffer_size = 6M
查询排序时所能使用的缓冲区大小。注意:该参数对应的分配内存是每连接独占!如果有100个连接,那么实际分配的总共排序缓冲区大小为100 × 6 = 600MB。所以,对于内存在4GB左右的服务器推荐设置为6-8M。

read_buffer_size = 4M
读查询操作所能使用的缓冲区大小。和sort_buffer_size一样,该参数对应的分配内存也是每连接独享!

join_buffer_size = 8M
联合查询操作所能使用的缓冲区大小,和sort_buffer_size一样,该参数对应的分配内存也是每连接独享!

myisam_sort_buffer_size = 64M
    table_cache = 512
    thread_cache_size = 64
    query_cache_size = 64M
指定MySQL查询缓冲区的大小。可以通过在MySQL控制台执行以下命令观察:

# > SHOW VARIABLES LIKE '%query_cache%';
# > SHOW STATUS LIKE 'Qcache%';
# 如果Qcache_lowmem_prunes的值非常大,则表明经常出现缓冲不够的情况;
如果Qcache_hits的值非常大,则表明查询缓冲使用非常频繁,如果该值较小反而会影响效率,那么可以考虑不用查询缓冲;Qcache_free_blocks,如果该值非常大,则表明缓冲区中碎片很多。

tmp_table_size = 256M
    max_connections = 768
指定MySQL允许的最大连接进程数。如果在访问论坛时经常出现Too Many Connections的错误提 示,则需要增大该参数值。

max_connect_errors = 10000000
    wait_timeout = 10
指定一个请求的最大连接时间,对于4GB左右内存的服务器可以设置为5-10。

thread_concurrency = 8
该参数取值为服务器逻辑CPU数量×2,在本例中,服务器有2颗物理CPU,而每颗物理CPU又支持H.T超线程,所以实际取值为4 × 2 = 8

skip-networking
开启该选项可以彻底关闭MySQL的TCP/IP连接方式,如果WEB服务器是以远程连接的方式访问MySQL数据库服务器则不要开启该选项!否则将无法正常连接!
分享到:
评论
1 楼 小桔子 2016-03-28  
你好!我遇到个问题 max_allowed_packet值总是重置1024。我的云服务器内存2G的, 内存是 2  Intel(R) Xeon(R) CPU E5-2680 v3 @ 2.50GHz。
skip-name-resolve 这个也设置了。账号就我和另外啊一个非技术员工知道啊。服务器上就装了一个tomcat发布了一个小型的Java web系统。哦多给?

相关推荐

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

    MySQL作为广泛使用的开源关系型数据库,其索引机制和查询优化技巧是开发者必须掌握的基本技能。 1. **索引的目的** 索引的主要目标是提高查询速度,就像字典中的索引帮助快速定位单词一样。在数据库中,索引使得...

    mysql数据库query的优化

    在实际应用中,不恰当的SQL查询可能导致数据库性能急剧下降,因此了解并掌握查询优化技巧至关重要。 首先,理解索引是优化查询的基础。索引就像书籍的目录,能帮助数据库快速定位数据。在MySQL中,B-Tree、Hash、R-...

    mysql优化十大技巧

    以下是关于MySQL优化十大技巧的详细阐述: 1. **存储引擎选择**:MySQL支持多种存储引擎,如MyISAM和InnoDB。InnoDB是默认且推荐的存储引擎,提供事务处理、行级锁定和外键约束,适合处理大量并发读写操作和需要...

    LAMP(Linux+Apache+Mysql+PHP)优化技巧.pdf

    下面我们将深入探讨各个组件的优化技巧。 **Linux优化** Linux作为基础操作系统,其性能直接影响到整个LAMP环境。优化Linux通常涉及调整内核参数、关闭不必要的服务和优化I/O。例如,升级内核到2.4或更高版本可以...

    mysql查询速度优化从3万秒到0.001秒共14页.pd

    7. **使用查询缓存**:对于经常执行的查询,MySQL提供了查询缓存功能,可以缓存结果,避免重复计算,但需要注意缓存命中率和内存占用。 8. **分区与分片**:对大表进行分区或分片,可以分散I/O负载,提高查询效率。...

    MySQL介绍和优化分享

    四、其他优化技巧 1. 使用慢查询日志:记录执行时间超过指定阈值的查询,帮助定位性能问题。 2. 规范化数据导入导出:批量数据操作时,使用LOAD DATA INFILE代替INSERT语句,可显著提升速度。 3. 定期分析和优化表:...

    MySql高性能优化.md

    同理,对于存储相同内容的 `VARCHAR(10)` 和 `VARCHAR(300)`,后者在表连接查询时会占用更多内存资源。 ##### 3. 尽量避免使用 NULL NULL 值不仅不利于索引建立,还会增加额外的存储开销。在实际应用中,应该尽...

    mysql数据库性能优化

    #### 五、其他优化技巧 ##### 1. 使用慢查询日志 - **定义**:慢查询日志记录了执行时间超过阈值的查询。 - **作用**:通过分析慢查询日志,可以找到性能瓶颈并进行优化。 ##### 2. 查询缓存 - **概念**:MySQL...

    深入浅出-MySQL数据库开发、优化与管理维护

    这本书旨在帮助读者深入理解MySQL的内部机制,提升开发效率,优化数据库性能,并掌握高效管理与维护MySQL数据库的技巧。 一、MySQL基础知识 MySQL是一个开源的关系型数据库管理系统,广泛应用于Web应用程序。它支持...

    MySQL查询优化技术讲座[收集].pdf

    7. **查询优化技巧**:除了索引,还可以通过其他方式优化查询,比如减少子查询、避免在WHERE子句中使用函数、使用EXPLAIN分析查询计划等。理解数据库查询执行的逻辑可以帮助找出性能瓶颈。 8. **存储引擎的选择**:...

    MySQL讨论:原理+优化+技巧

    ### MySQL 讨论:原理+优化+技巧 #### MySQL 简介 MySQL是一种流行的开源关系型数据库管理系统,因其快速、稳定、易于使用且免费开放源代码的特点而被广泛采用。MySQL支持多种操作系统,包括但不限于Linux、...

    大牛-高级教程MySQL性能优化实战

    5. **查询缓存**:MySQL的查询缓存能存储已执行过的查询结果,再次遇到相同查询时可直接返回,但要注意缓存的维护和清理,避免过多无效缓存占用内存。 6. **表结构优化**:合理设计数据库表结构,避免数据冗余,...

    MySQL大神的服务器内核以及系统相关优化手册

    这是一个 MySQL 服务器内核和系统相关优化手册,旨在帮助 MySQL 数据库管理员和开发者了解 MySQL 服务器的性能优化技巧和方法。本手册涵盖了 MySQL 服务器的架构、系统瓶颈定位、性能优化、系统资源分配、存储设备...

    优化mysql的种种技巧尽在其中,绝对有价值

    ### 优化 MySQL 的种种技巧详解 #### 调优概述 在进行 MySQL 数据库的优化过程中,首先要明确的是,优化工作并非一蹴而就的事情,它涉及到诸多层面,包括但不限于硬件资源、网络环境、系统配置以及数据库自身的...

    MySQL查询优化的5个实用技巧

    这些技巧只是MySQL查询优化的一部分,实践中应结合查询执行计划、慢查询日志和基准测试,不断尝试和调整,以找到最佳的优化策略。通过这些方法,数据库性能将得到显著提升,为应用程序提供更好的服务。

    mysql优化,by叶金荣

    #### 四、MyISAM优化技巧 - **key_buffer_size**:设置MyISAM索引缓存的内存大小,对于频繁查询的场景非常重要。 - **query_cache_size**:控制查询缓存的总内存大小,合理设置可以显著提升查询性能。 - **long_...

    一篇文章掌握MySQL的索引查询优化技巧

    MySQL的索引查询优化是数据库性能提升的关键环节。在MySQL中,索引是一种特殊的数据结构,用于加速数据的检索过程。以下是一些重要的优化策略: 1. **选择合适的存储引擎**: MySQL支持多种存储引擎,如InnoDB、...

    万字总结:学习MySQL优化原理,这一篇就够了!

    在理解了MySQL的工作原理后,接下来我们将介绍一些具体的查询优化技巧: 1. **避免使用`SELECT *`**:这会导致不必要的数据加载到内存中,增加网络传输的负担。建议仅选择需要的列进行查询。 2. **合理使用索引**...

Global site tag (gtag.js) - Google Analytics