my.cnf(my.ini)重要参数优化配置说明

MyISAM存储引擎

MyISAM存储引擎适用于读多写少,对读性能要求比较高的系统

官方文档:http://dev.mysql.com/doc/refman/5.6/en/myisam-storage-engine.html

Key_buffer_size,可以设置为内存的30%-40%左右。通过show variables like ‘%key_buffer_size%';

通过 show global status like ‘%key_blocks_unused%' 查看是否还有剩余,如果剩余很多,就不需要再加大key_buffer_size了
如果不用MyISAM,建议设置16m到32m就可以了

Query_cache 如果应用程序有大量读且应用程序级别没有缓存,设置这个会比较有用,但是也别太大,维护开销比较大,mysql反而会变慢,建议32m到512m

Sort_buffer_size当进行复杂查询时候用到,建议8m到16m

Query_cache_size缓存select查询结果,如果有大量相同查询,可以将这个值加大。

Bulk_insert_buffer_size 批量insert时候使用,必须小于key_buffer_size

Read_rnd_buffer_size sql有order by的情况下并且第二次查询时候就会用到,他会记录排序,将直接从内存中读取。

Thread_cache_size cache中保留多少线程重用,如果再设置的值内,线程断开也不会销毁,等待新链接。减少线程创建的开销。

参数官方参考文档:http://dev.mysql.com/doc/refman/5.6/en/optimizing-myisam.html

Innodb 存储引擎

Innodb 存储引擎 1

并发线程数:Innodb_thread_concurrency=0[默认],并不是说没有并发,而是指无限并发,没有并发检查。innodb内部自己控制
取值0到1000

建议:

Cpu数量+磁盘数量 * 2,如果有RAID主备,就不乘2,因为有备份磁盘

Innodb 存储引擎 2

Innodb_io_capacity默认值是200,个人认为是表示磁盘IO的吞吐量,innodb每秒后台进程处理IO操作的数据页上限

Innodb_io_capacity_max默认2000,设置IO上线

源码:在innodb存储引擎层搜索srv_io_capacity(主要在srv0srv.c文件中)

当使用SSD可以再调高一些,直到符合磁盘IO吞吐量即可

Innodb 存储引擎 3

innodb_max_dirty_pages_pct innodb从innodb buffer中刷新脏页的比例15% - 80%

源码:在innodb存储引擎层搜索srv_max_buf_pool_modified_pct(主要在srv0srv.c文件中)

Innodb 存储引擎 4 [重要]

innodb_flush_method( O_DSYNC 、 O_DIRECT )

O_DSYNC:InnoDB使用O_SYNC模式打开并更新日志文件,用fsync()函数去更新数据文件。

O_DIRECT:InnoDB使用O_DIRECT模式打开数据文件,用fsync()函数去更新日志和数据文件

在raid设备上,为了避免数据被innodb_buffer和raid多次cache,设置为O_DIRECT方式。也就是说直接打开数据文件,不用打开日志文件了。

源码:在innodb存储引擎层搜索srv_unix_file_flush_method(主要在log0log.c、os0file.c文件中)

Innodb 存储引擎 5 【重要】

innodb_buffer_pool_size

Innodb会遵循lru,在录入数据的时候会根据数据的情况,会加载到innodb_buffer_pool_size 中。如果操作数据的时候就省去了去数据文件中查找,直接从内存中找到了。

一般设置内存的80%左右,但需要考虑数据文件的总量是多大。Buffer_pool_size + 数据量所占容量 + 操作系统所用内存 = 内存大小。尽可能设置多一些。

源码:在innodb存储引擎层搜索srv_buf_pool_size(在srv0srv.c、srv0start.c文件中)。

Innodb 存储引擎 6

innodb_buffer_pool_instances 当有多实例的情况下,需要设置。

源码:在innodb存储引擎层搜索srv_buf_pool_instances(主要集中在的buf0buf.c文件)

Innodb 存储引擎 7

innodb_log_file_size 日志文件大小

innodb_log_buffer_size 日志缓存大小

先写入innodb_log_buffer,buffer写满或事务提交,刷新数据,大事务频繁,增加innodb_log_buffer_size大小,默认16M。

源码:在innodb存储引擎层搜索srv_log_buffer_size(主要在log0log.c文件中)

Innodb 存储引擎 8 【重要】

Innodb_file_per_table

当设置Innodb_file_per_table 为1时为打开状态,也就是设置所有表为独立表空间,一个表一个存储数据文件。同时要设置

Innodb_open_files(同时打开文件数)。因为每个表对应一个数据文件,所以需要设置同时打开文件的数量以保证查询多表的情况,并且想要把某个表移出的别的磁盘时共享表空间是无法迁移的,因为所有表都使用着共享表空间。

默认是所有表都放到共享空间中。也就是OFF

innodb 存储引擎9

Innodb_flush_log_at_trx_commit 核心参数:

0:每秒将log buffer的内容写事务日志并且刷新到磁盘

1:每个事务提交后,将log buffer的内容写事务日志并写入数据磁盘

2:每个事务提交,将log buffer内容写事务日志,但是不进行数据刷盘

Sync_binlog

双一致模式: innodb_flush_log_at_trx_commit=1;sync_binlog=1;这样的主从数据是一致的,不会丢数据。

官方参数描述地址: http://dev.mysql.com/doc/refman/5.6/en/innodb-parameters.html

系统参数优化

NUMA(双实例下,可以把每一个实例放到numa单独控制的节点下面)

在os层numa关闭时,打开bios层的numa会影响性能,QPS会下降15-30%左右;

在bios层面numa关闭是,无论os层面的numa是否打开,都不会影响性能。

系统优化 jemalloc

网卡优化:RPS+RFS

malloc

1)、下载jemalloc源码包
wget http://www.canonware.com/download/jemalloc/jemalloc-3.6.0.tar.bz2
tar -xjf jemalloc-3.6.0.tar.bz2

2)、编译安装
cd jemalloc-3.6.0; ./configure;make &make install

3)、配置MySQL

[mysqld_safe]
malloc-lib=$PATH/libjemalloc.so

4)、参考文档:http://blog.chinaunix.net/uid-29957450-id-4547818.html

my.cnf配置文件参考

# 以下选项会被MySQL客户端应用读取。
# 注意只有MySQL附带的客户端应用程序保证可以读取这段内容。
# 如果你想你自己的MySQL应用程序获取这些值。
# 需要在MySQL客户端库初始化的时候指定这些选项。
[client]
port    = 3306
socket   = /usr/local/mysql/mysql.sock
# MySQL 服务端
[mysqld]
#默认存储引擎INNODB
default-storage-engine=INNODB
#GROUP_CONCAT长度
group_concat_max_len =99999
#端口号
port    = 3306
#socket位置
socket   = /usr/local/mysql/mysql.sock
#pid写入文件位置
pid-file    = /usr/local/mysql/mysqld.pid
#数据库文件位置
datadir     = /home/data/mysql/data
user    = mysql
#SQL模式具体查阅相关资料
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
#当外部锁定(external-locking)起作用时,每个进程若要访问数据表,
#则必须等待之前的进程完成操作并解除锁定。由于服务器访问数据表时经常需要等待解锁,
#因此在单服务器环境下external locking会让MySQL性能下降。
#所以在很多Linux发行版的源中,MySQL配置文件中默认使用了skip-external-locking来避免external locking。
skip-external-locking
#跳过DNS反向解析
skip-name-resolve
#关闭TIMESTAMP类型默认值
explicit_defaults_for_timestamp

#不受client字符集影响,保证sever端字符集
skip-character-set-client-handshake
#初始连接字符集UTF8
init-connect='SET NAMES utf8'
#默认数据库字符集
character-set-server=utf8

#查询缓存0,1,2,分别代表了off、on、demand
query_cache_type = 1
#单位秒,握手时间超过connect_timeout,连接请求将会被拒绝
connect_timeout = 20
#设置在多少秒没收到主库传来的Binary Logs events之后,从库认为网络超时,Slave IO线程会重新连接主库。
#该参数的默认值是3600s ,然而时间太久会造成数据库延迟或者主备库直接的链接异常不能及时发现。
#将 slave_net_timeout 设得很短会造成 Master 没有数据更新时频繁重连。一般线上设置为5s
slave_net_timeout = 30

#这个参数用来配置从服务器的更新是否写入二进制日志,这个选项默认是不打开的,
#但是,如果这个从服务器B是服务器A的从服务器,同时还作为服务器C的主服务器,那么就需要开发这个选项,
#这样它的从服务器C才能获得它的二进制日志进行同步操作
log-slave-updates=1
#用于slave服务器,io线程会把server id与自己相同的event写入日志,与log-slave-updates选项冲突
replicate-same-server-id=0
# 对了生成唯一的server_id我想到了,大家ip地址唯一,比如10.112.87.91 ,就直接去掉点号在后面加上编号01或者02或者03(加上2位数编号是怕一台物理机
沧岸嗍道,主从复制需要server-id来标识的
# 用10112879101做server_id就可以了。
server_id=10112879101
# 打开二进制日志功能.
# 在复制(replication)配置中,作为MASTER主服务器必须打开此项
# 如果你需要从你最后的备份中做基于时间点的恢复,你也同样需要二进制日志
log-bin =/home/data/mysql/binlog/mysql-bin.log
#relay-log日志
relay-log=mysql-relay-bin
#master-info-repository以及relay-log-info-repository打开以启用崩溃安全的二进制日志/从服务器功能(在事务表而不是平面文件中存储信息)
master-info-repository=TABLE
relay-log-info-repository=TABLE

#不写入binlog二进制日志中的数据库
binlog-ignore-db=mysql       # No sync databases
binlog-ignore-db=test        # No sync databases
binlog-ignore-db=information_schema   # No sync databases
binlog-ignore-db=performance_schema   # No sync databases

#写入binlog二进制日志中数据库
binlog-do-db=business_db
binlog-do-db=user_db
binlog-do-db=plocc_system

#15滚动清理binlog
expire-logs-days=15
max_binlog_size = 1073741824      # Bin logs size ( 1G )

#使binlog在每1000次binlog写入后与硬盘同步
sync_binlog = 1000

#指定只复制哪个库的数据
replicate-do-db=business_db
replicate-do-db=user_db
replicate-do-db=plocc_system

#开启事件调度器Event Scheduler
event_scheduler=1
#MySQL能暂存的连接数量。当主要MySQL线程在一个很短时间内得到非常多的连接请求,这就起作用。
#如果MySQL的连接数据达到max_connections时,新来的请求将会被存在堆栈中,以等待某一连接释放资源,
#该堆栈的数量即back_log,如果等待连接的数量超过back_log,将不被授予连接资源
back_log = 500

#整个数据库最大连接(用户)数
max_connections = 6000
#一个用户的最大连接数
max_user_connection=3000
# 每个客户端连接最大的错误允许数量,如果达到了此限制.
# 这个客户端将会被MySQL服务阻止直到执行了”FLUSH HOSTS” 或者服务重启
# 非法的密码以及其他在链接时的错误会增加此值.
# 查看 “Aborted_connects” 状态来获取全局计数器
max_connect_errors = 1844674407370954751
#表描述符缓存大小,可减少文件打开/关闭次数
table_open_cache = 2048

# 服务所能处理的请求包的最大大小以及服务所能处理的最大的请求大小(当与大的BLOB字段一起工作时相当必要)
# 每个连接独立的大小.大小动态增加
max_allowed_packet = 64M
# 在一个事务中binlog为了记录SQL状态所持有的cache大小
# 如果你经常使用大的,多声明的事务,你可以增加此值来获取更大的性能.
# 所有从事务来的状态都将被缓冲在binlog缓冲中然后在提交后一次性写入到binlog中
# 如果事务比此值大, 会使用磁盘上的临时文件来替代.
# 此缓冲在每个连接的事务第一次更新状态时被创建
binlog_cache_size = 1M
# 独立的内存表所允许的最大容量.
# 此选项为了防止意外创建一个超大的内存表导致用尽所有的内存资源.
max_heap_table_size = 1342177280
# 排序缓冲被用来处理类似ORDER BY以及GROUP BY队列所引起的排序
# 如果排序后的数据无法放入排序缓冲,
# 一个用来替代的基于磁盘的合并分类会被使用
# 查看 “Sort_merge_passes” 状态变量.
# 在排序发生时由每个线程分配
sort_buffer_size = 8M
# 此缓冲被使用来优化全联合(full JOINs 不带索引的联合).
# 类似的联合在极大多数情况下有非常糟糕的性能表现,
# 但是将此值设大能够减轻性能影响.
# 通过 “Select_full_join” 状态变量查看全联合的数量
# 当全联合发生时,在每个线程中分配
join_buffer_size = 8M
# 我们在cache中保留多少线程用于重用
# 当一个客户端断开连接后,如果cache中的线程还少于thread_cache_size,
# 则客户端线程被放入cache中.
# 这可以在你需要大量新连接的时候极大的减少线程创建的开销
# (一般来说如果你有好的线程模型的话,这不会有明显的性能提升.)
thread_cache_size = 128
# 此允许应用程序给予线程系统一个提示在同一时间给予渴望被运行的线程的数量.
# 此值只对于支持 thread_concurrency() 函数的系统有意义( 例如Sun Solaris).
# 你可可以尝试使用 [CPU数量]*(2..4) 来作为thread_concurrency的值
thread_concurrency = 8
# 查询缓冲常被用来缓冲 SELECT 的结果并且在下一次同样查询的时候不再执行直接返回结果.
# 打开查询缓冲可以极大的提高服务器速度, 如果你有大量的相同的查询并且很少修改表.
# 查看 “Qcache_lowmem_prunes” 状态变量来检查是否当前值对于你的负载来说是否足够高.
# 注意: 在你表经常变化的情况下或者如果你的查询原文每次都不同,
# 查询缓冲也许引起性能下降而不是性能提升.
query_cache_size = 64M
# 只有小于此设定值的结果才会被缓冲
# 此设置用来保护查询缓冲,防止一个极大的结果集将其他所有的查询结果都覆盖
query_cache_limit = 2M
# 被全文检索索引的最小的字长.
# 你也许希望减少它,如果你需要搜索更短字的时候.
# 注意在你修改此值之后,
# 你需要重建你的 FULLTEXT 索引
ft_min_word_len = 4
# 线程使用的堆大小. 此容量的内存在每次连接时被预留.
# MySQL 本身常不会需要超过64K的内存
# 如果你使用你自己的需要大量堆的UDF函数
# 或者你的操作系统对于某些操作需要更多的堆,
# 你也许需要将其设置的更高一点.
thread_stack = 192K
# 设定默认的事务隔离级别.可用的级别如下:
# READ-UNCOMMITTED, READ-COMMITTED, REPEATABLE-READ, SERIALIZABLE
transaction_isolation = READ-COMMITTED
# 内部(内存中)临时表的最大大小
# 如果一个表增长到比此值更大,将会自动转换为基于磁盘的表.
# 此限制是针对单个表的,而不是总和.
tmp_table_size = 1342177280

#binlog日志类型--混合型
binlog_format=mixed
#开启慢查询日志
slow_query_log
#文件格式
log_output = FILE
# 所有的使用了比这个时间(以秒为单位)更多的查询会被认为是慢速查询.
# 不要在这里使用”0″, 否则会导致所有的查询,甚至非常快的查询页被记录下来(由于MySQL 目前时间的精确度只能达到秒的级别).
long_query_time = 0.5
#慢查询日志位置
slow_query_log_file=/usr/local/mysql/mysqld_slow.log
#指定索引缓冲区的大小,它决定索引处理的速度,尤其是索引读的速度

#******************** MyISAM 相关选项********************************
# 关键词缓冲的大小, 一般用来缓冲MyISAM表的索引块.
# 不要将其设置大于你可用内存的30%,
# 因为一部分内存同样被OS用来缓冲行数据
# 甚至在你并不使用MyISAM 表的情况下, 你也需要仍旧设置起 8-64M 内存由于它同样会被内部临时磁盘表使用.
key_buffer_size = 32M
# 用来做MyISAM表全表扫描的缓冲大小.
# 当全表扫描需要时,在对应线程中分配.
read_buffer_size = 2M
# 当在排序之后,从一个已经排序好的序列中读取行时,行数据将从这个缓冲中读取来防止磁盘寻道.
# 如果你增高此值,可以提高很多ORDER BY的性能.
# 当需要时由每个线程分配
read_rnd_buffer_size = 8M
# MyISAM 使用特殊的类似树的cache来使得突发插入
# (这些插入是,INSERT … SELECT, INSERT … VALUES (…), (…), …, 以及 LOAD DATA
# INFILE) 更快. 此变量限制每个进程中缓冲树的字节数.
# 设置为 0 会关闭此优化.
# 为了最优化不要将此值设置大于 “key_buffer_size”.
# 当突发插入被检测到时此缓冲将被分配.
bulk_insert_buffer_size = 16M
# 此缓冲当MySQL需要在 REPAIR, OPTIMIZE, ALTER 以及 LOAD DATA INFILE 到一个空表中引起重建索引时被分配.
# 这在每个线程中被分配.所以在设置大值时需要小心.
myisam_sort_buffer_size = 128M
# MySQL重建索引时所允许的最大临时文件的大小 (当 REPAIR, ALTER TABLE 或者 LOAD DATA INFILE).
# 如果文件大小比此值更大,索引会通过键值缓冲创建(更慢)
myisam_max_sort_file_size = 1G
# 如果一个表拥有超过一个索引, MyISAM 可以通过并行排序使用超过一个线程去修复他们.
# 这对于拥有多个CPU以及大量内存情况的用户,是一个很好的选择.
myisam_repair_threads = 1
# 自动检查和修复没有适当关闭的 MyISAM 表.
myisam_recover

# *************** INNODB 相关选项 *********************
# 如果你的MySQL服务包含InnoDB支持但是并不打算使用的话,
# 使用此选项会节省内存以及磁盘空间,并且加速某些部分
#skip-innodb

# #####[关键项]
# InnoDB使用一个缓冲池来保存索引和原始数据, 不像 MyISAM.
# 这里你设置越大,你在存取表里面数据时所需要的磁盘I/O越少.
# 在一个独立使用的数据库服务器上,你可以设置这个变量到服务器物理内存大小的80%
# 不要设置过大,否则,由于物理内存的竞争可能导致操作系统的换页颠簸.
# 注意在32位系统上你每个进程可能被限制在 2-3.5G 用户层面内存限制,
# 所以不要设置的太高.
innodb_buffer_pool_size = 700m #1G
# InnoDB 将数据保存在一个或者多个数据文件中成为表空间.
# 如果你只有单个逻辑驱动保存你的数据,一个单个的自增文件就足够好了.
# 其他情况下.每个设备一个文件一般都是个好的选择.
# 你也可以配置InnoDB来使用裸盘分区 – 请参考手册来获取更多相关内容
innodb_data_file_path = IBdata1:1024M;IBdata2:1024M:autoextend
# 设置此选项如果你希望InnoDB表空间文件被保存在其他分区.
# 默认保存在MySQL的datadir中.
#innodb_data_home_dir =
# 用来同步IO操作的IO线程的数量. This value is
# 此值在Unix下被硬编码为4,但是在Windows磁盘I/O可能在一个大数值下表现的更好.
innodb_file_io_threads = 4
# 在InnoDb核心内的允许线程数量.
# 最优值依赖于应用程序,硬件以及操作系统的调度方式.
# 过高的值可能导致线程的互斥颠簸.
innodb_thread_concurrency = 16
# #####[关键项]
# 如果设置为1 ,InnoDB会在每次提交后刷新(fsync)事务日志到磁盘上,
# 这提供了完整的ACID行为.
# 如果你愿意对事务安全折衷, 并且你正在运行一个小的事务, 你可以设置此值到0或者2来减少由事务日志引起的磁盘I/O
# 0代表日志只大约每秒写入日志文件并且日志文件刷新到磁盘.
# 2代表日志写入日志文件在每次提交后,但是日志文件只有大约每秒才会刷新到磁盘上.
# --------------------
# (说明:如果是游戏服务器,建议此值设置为2;如果是对数据安全要求极高的应用,建议设置为1;
# 设置为0性能最高,但如果发生故障,数据可能会有丢失的危险!
# 默认值1的意思是每一次事务提交或事务外的指令都需要把日志写入(flush)硬盘,这是很费时的。
# 特别是使用电池供电缓存(Battery backed up cache)时。设成2对于很多运用,特别是从MyISAM表转过来的是可以的,
# 它的意思是不写入硬盘而是写入系统缓存。日志仍然会每秒flush到硬盘,所以你一般不会丢失超过1-2秒的更新。
# 设成0会更快一点,但安全方面比较差,即使MySQL挂了也可能会丢失事务的数据。而值2只会在整个操作系统挂了时才可能丢数据)
innodb_flush_log_at_trx_commit = 2

# 用来缓冲日志数据的缓冲区的大小.
# 当此值快满时, InnoDB将必须刷新数据到磁盘上.
# 由于基本上每秒都会刷新一次,所以没有必要将此值设置的太大(甚至对于长事务而言)
innodb_log_buffer_size = 16M

# 在日志组中每个日志文件的大小.
# 你应该设置日志文件总合大小到你缓冲池大小的25%~100%
# 来避免在日志文件覆写上不必要的缓冲池刷新行为.
# 不论如何, 请注意一个大的日志文件大小会增加恢复进程所需要的时间
innodb_log_file_size = 1024M

# 在日志组中的文件总数.
# 通常来说2~3是比较好的.
innodb_log_files_in_group = 3

# InnoDB的日志文件所在位置. 默认是MySQL的datadir.
# 你可以将其指定到一个独立的硬盘上或者一个RAID1卷上来提高其性能
#innodb_log_group_home_dir

# 在InnoDB缓冲池中最大允许的脏页面的比例.
# 如果达到限额, InnoDB会开始刷新他们防止他们妨碍到干净数据页面.
# 这是一个软限制,不被保证绝对执行.
innodb_max_dirty_pages_pct = 90

# InnoDB用来刷新日志的方法.
# 表空间总是使用双重写入刷新方法
# 默认值是 “fdatasync”, 另一个是 “O_DSYNC”.
innodb_flush_method=O_DSYNC

# 在被回滚前,一个InnoDB的事务应该等待一个锁被批准多久.
# InnoDB在其拥有的锁表中自动检测事务死锁并且回滚事务.
# 如果你使用 LOCK TABLES 指令, 或者在同样事务中使用除了InnoDB以外的其他事务安全的存储引擎
# 那么一个死锁可能发生而InnoDB无法注意到.
# 这种情况下这个timeout值对于解决这种问题就非常有帮助.
innodb_lock_wait_timeout = 30

[mysqldump]
# 不要在将内存中的整个结果写入磁盘之前缓存. 在导出非常巨大的表时需要此项
quick

max_allowed_packet = 64M

[mysql]
no-auto-rehash

[myisamchk]
key_buffer_size = 512M
sort_buffer_size = 512M
read_buffer = 8M
write_buffer = 8M

[mysqlhotcopy]
interactive-timeout

[mysqld_safe]
# 增加每个进程的可打开文件数量.
# 警告: 确认你已经将全系统限制设定的足够高!
# 打开大量表需要将此值设大
open-files-limit = 8192
log-error=/usr/local/mysql/mysqld.log
pid-file=/usr/local/mysql/mysqld.pid

MYSQL的性能优化不单单是这些内容,还有很多大家可以在我们站上搜索其它MYSQL性能优化方案

(0)

相关推荐

  • 浅谈InnoDB隔离模式的使用对MySQL性能造成的影响

    在这篇文章里我将讨论一个相关的主题 – InnoDB 事务隔离模式,还有它们与MVCC(多版本并发控制)的关系,以及它们是如何影响MySQL性能的. MySQL手册提供了一个关于MySQL支持的事务隔离模式的恰当描述 – 在这里我并不会再重复,而是聚焦到对性能的影响上. SERIALIZABLE – 这是最强的隔离模式,本质上打败了在锁管理(设置锁是很昂贵的)的条件下,多版本控制对所有选择进行锁定造成大量的开销,还有你得到的并发.这个模式仅在MySQL应用中非常特殊的情况下使用. REPEATA

  • 详解MySQL性能优化(一)

    一.MySQL的主要适用场景 1.Web网站系统 2.日志记录系统 3.数据仓库系统 4.嵌入式系统 二.MySQL架构图: 三.MySQL存储引擎概述 1)MyISAM存储引擎 MyISAM存储引擎的表在数据库中,每一个表都被存放为三个以表名命名的物理文件.首先肯定会有任何存储引擎都不可缺少的存放表结构定义信息的.frm文件,另外还有.MYD和.MYI文件,分别存放了表的数据(.MYD)和索引数据(.MYI).每个表都有且仅有这样三个文件做为MyISAM存储类型的表的存储,也就是说不管这个表有

  • Mysql性能优化案例 - 覆盖索引分享

    场景 产品中有一张图片表,数据量将近100万条,有一条相关的查询语句,由于执行频次较高,想针对此语句进行优化 表结构很简单,主要字段: 复制代码 代码如下: user_id 用户ID picname 图片名称 smallimg 小图名称 一个用户会有多条图片记录 现在有一个根据user_id建立的索引:uid 查询语句也很简单:取得某用户的图片集合 复制代码 代码如下: select picname, smallimg from pics where user_id = xxx; 优化前 执行查

  • MySQL性能优化的最佳20+条经验

    今天,数据库的操作越来越成为整个应用的性能瓶颈了,这点对于Web应用尤其明显.关于数据库的性能,这并不只是DBA才需要担心的事,而这更是我们程序员需要去关注的事情.当我们去设计数据库表结构,对操作数据库时(尤其是查表时的SQL语句),我们都需要注意数据操作的性能.这里,我们不会讲过多的SQL语句的优化,而只是针对MySQL这一Web应用最多的数据库.希望下面的这些优化技巧对你有用. 1. 为查询缓存优化你的查询 大多数的MySQL服务器都开启了查询缓存.这是提高性最有效的方法之一,而且这是被My

  • MySQL性能全面优化方法参考,从CPU,文件系统选择到mysql.cnf参数优化

    本文整理了一些MySQL的通用优化方法,做个简单的总结分享,旨在帮助那些没有专职MySQL DBA的企业做好基本的优化工作,至于具体的SQL优化,大部分通过加适当的索引即可达到效果,更复杂的就需要具体分析了,可以参考本站的一些优化案例或者联系我们 1.硬件层相关优化 1.1.CPU相关 在服务器的BIOS设置中,可调整下面的几个配置,目的是发挥CPU最大性能,或者避免经典的NUMA问题: 1.选择Performance Per Watt Optimized(DAPC)模式,发挥CPU最大性能,跑

  • 19个MySQL性能优化要点解析

    以下就是跟大家分享的19个MySQL性能优化主要要点,一起学习学习. 1.为查询优化你的查询 大多数的MySQL服务器都开启了查询缓存.这是提高性最有效的方法之一,而且这是被MySQL的数据库引擎处理的.当有很多相同的查询被执行了多次的时候,这些查询结果会被放到一个缓存中,这样,后续的相同的查询就不用操作表而直接访问缓存结果了. 这里最主要的问题是,对于程序员来说,这个事情是很容易被忽略的.因为,我们某些查询语句会让MySQL不使用缓存.请看下面的示例: // 查询缓存不开启 $r = mysq

  • mysql性能优化之索引优化

    作为免费又高效的数据库,mysql基本是首选.良好的安全连接,自带查询解析.sql语句优化,使用读写锁(细化到行).事物隔离和多版本并发控制提高并发,完备的事务日志记录,强大的存储引擎提供高效查询(表记录可达百万级),如果是InnoDB,还可在崩溃后进行完整的恢复,优点非常多.即使有这么多优点,仍依赖人去做点优化,看书后写个总结巩固下,有错请指正. 完整的mysql优化需要很深的功底,大公司甚至有专门写mysql内核的,sql优化攻城狮,mysql服务器的优化,各种参数常量设定,查询语句优化,主

  • 10个MySQL性能调优的方法

    MYSQL 应该是最流行了 WEB 后端数据库.WEB 开发语言最近发展很快,PHP, Ruby, Python, Java 各有特点,虽然 NOSQL 最近越來越多的被提到,但是相信大部分架构师还是会选择 MYSQL 来做数据存储. MYSQL 如此方便和稳定,以至于我们在开发 WEB 程序的时候很少想到它.即使想到优化也是程序级别的,比如,不要写过于消耗资源的 SQL 语句.但是除此之外,在整个系统上仍然有很多可以优化的地方. 1. 选择合适的存储引擎: InnoDB 除非你的数据表使用来做

  • MySQL性能参数详解之Max_connect_errors 使用介绍

    max_connect_errors是一个MySQL中与安全有关的计数器值,它负责阻止过多尝试失败的客户端以防止暴力破解密码的情况.max_connect_errors的值与性能并无太大关系. 默认情况下,my.cnf文件中可能没有此行,如果需要设置此数值,手动添加即可. 参数格式 max_connect_errors = 10 修改方法 如果系统是CentOS.Debian等,则配置文件可能位于 /etc/my.cnf .打开此文件 [root@www ~]# vi /etc/my.cnf 然

  • MySQL性能监控软件Nagios的安装及配置教程

    Nagios是一款Linux上成熟的监视系统运行状态和网络信息的开原IT基础设施监视系统,Nagios能监视所指定的本地或远程主机及服务,例如HTTP服务.FTP服务等,同时提供异常通知.事件处理等功能,当主机或服务出现故障时,Nagios还可以通过邮件.手机短信等形式在第一时间进行通知.Nagios可运行在Linux和Unix平台上,同时提供一个可选的基于浏览器的Web界面,方便系统管理员查看系统的运行状态.网络状态.各种系统问题及日志异常等. 环境: 192.168.0.201      m

  • 详解MySQL性能优化(二)

    接着上一篇学习:http://www.jb51.net/article/70528.htm 七.MySQL数据库Schema设计的性能优化 高效的模型设计 适度冗余-让Query尽两减少Join 大字段垂直分拆-summary表优化 大表水平分拆-基于类型的分拆优化 统计表-准实时优化 合适的数据类型 时间存储格式总类并不是太多,我们常用的主要就是DATETIME,DATE和TIMESTAMP这三种了.从存储空间来看TIMESTAMP最少,四个字节,而其他两种数据类型都是八个字节,多了一倍.而T

  • 使用FriendFeed来提升MySQL性能的方法

     背景 我们使用MySQL存储了FriendFeed的所有数据.数据库随着用户基数的增长而增长了很多.现在已经存储了超过2.5亿条记录与一堆涵盖了从评论和"喜欢"到好友列表的其他数据. 随着数据的增长,我们也曾迭代地解决了随着如此迅猛的增长而带来的扩展性问题.我们的尝试很有代表性,例如使用只读mysql从节点和memcache来增加读取吞吐量,对数据库进行分片来提高写入吞吐量.然而,随着业务的增长,添加新功能比扩展既有功能以迎合更多的流量变得更加困难. 特别的,对 schema 做改动

  • Mysql性能优化方案分享

    网上有不少mysql 性能优化方案,不过,mysql的优化同sql server相比,更为麻烦,同样的设置,在不同的环境下 ,由于内存,访问量,读写频率,数据差异等等情况,可能会出现不同的结果,因此简单地根据某个给出方案来配置mysql是行不通的,最好能使用status信息对mysql进行具体的优化. mysql> show global status; 可以列出MySQL服务器运行各种状态值,另外,查询MySQL服务器配置信息语句: mysql> show variables; 一.慢查询

  • 数据库Mysql性能优化详解

    在mysql数据库中,mysql key_buffer_size是对MyISAM表性能影响最大的一个参数(注意该参数对其他类型的表设置无效),下面就将对mysql Key_buffer_size参数的设置进行详细介绍下面为一台以MyISAM为主要存储引擎服务器的配置: mysql> show variables like 'key_buffer_size'; +-----------------+------------+ | Variable_name | Value | +---------

  • mysql性能优化工具--tuner-primer使用介绍

    下载并改变执行权限: wget http://www.day32.com/MySQL/tuning-primer.sh chmod +x tuning-primer.sh ./tuning-primer.sh 结果报告: 会用几种颜色标记: 蓝色:总指标 绿色:表示此参数还可以 红色:表示此参数有严重问题 深红色:表示有问题参数 黄色:一些信息提示 而且还有警告: Note! This script will still suggest raising the join_buffer_size

  • Mysql性能优化案例研究-覆盖索引和SQL_NO_CACHE

    场景 产品中有一张图片表pics,数据量将近100万条,有一条相关的查询语句,由于执行频次较高,想针对此语句进行优化 表结构很简单,主要字段: 复制代码 代码如下: user_id 用户ID picname 图片名称 smallimg 小图名称 一个用户会有多条图片记录,现在有一个根据user_id建立的索引:uid,查询语句也很简单:取得某用户的图片集合: 复制代码 代码如下: select picname, smallimg from pics where user_id = xxx; 优化

  • MySQL性能瓶颈排查定位实例详解

    本文实例讲述了MySQL性能瓶颈排查定位的方法.分享给大家供大家参考,具体如下: 导读 从一个现场说起,全程解析如何定位性能瓶颈. 排查过程 收到线上某业务后端的MySQL实例负载比较高的告警信息,于是登入服务器检查确认. 1. 首先我们进行OS层面的检查确认 登入服务器后,我们的目的是首先要确认当前到底是哪些进程引起的负载高,以及这些进程卡在什么地方,瓶颈是什么. 通常来说,服务器上最容易成为瓶颈的是磁盘I/O子系统,因为它的读写速度通常是最慢的.即便是现在的PCIe SSD,其随机I/O读写

  • MySQL性能参数详解之Skip-External-Locking参数介绍

    MySQL的配置文件my.cnf中默认存在一行skip-external-locking的参数,即"跳过外部锁定".根据MySQL开发网站的官方解释,External-locking用于多进程条件下为MyISAM数据表进行锁定. 如果你有多台服务器使用同一个数据库目录(不建议),那么每台服务器都必须开启external locking:   参数解释 当外部锁定(external-locking)起作用时,每个进程若要访问数据表,则必须等待之前的进程完成操作并解除锁定.由于服务器访问数

随机推荐