当前位置:首页 » 文件管理 » sqlmyisam缓存池

sqlmyisam缓存池

发布时间: 2023-03-18 05:32:19

‘壹’ mariadb 如何实现服务器内存使用最大化

查询最高内存占用

使用以下命令可以知道mysql的配置使用多少 RAM

SELECT ( @@key_buffer_size
+ @@query_cache_size
+ @@innodb_buffer_pool_size
+ @@innodb_additional_mem_pool_size
+ @@innodb_log_buffer_size
+ @@max_connections * ( @@read_buffer_size
+ @@read_rnd_buffer_size
+ @@sort_buffer_size
+ @@join_buffer_size
+ @@binlog_cache_size
+ @@thread_stack
+ @@tmp_table_size
)
) / (1024 * 1024 * 1024) AS MAX_MEMORY_GB;

可以使用mysql计算器来计算内存使用

下面是理论,可以直接到推荐配置

如何调整配置

key_buffer_size(MyISAM索引用)

指定索引缓冲区的大小,它决定索引处理的速度,尤其是索引读的速度。为了逗带最小化磁盘的 I/O , MyISAM 存储引擎的表使用键高速缓存来缓存索引,这个键高速缓存的大小则通过 key-buffer-size 参数来设置。如果应用系统中使用指侍的表以 MyISAM 存储引擎为主,则应该适当增加该参数的值,以便尽可能的缓存索引,提高访问的速度。

怎么设

show global status like 'key_read%';

+------------------------+-------------+
| Variable_name | Value |
+------------------------+-------------+
| Key_read_requests | 27813678764 |
| Key_reads | 6798830 |
---------------------

  • key_buffer_size通过检查状态值Key_read_requests和Key_reads,可以知道key_buffer_size设置是否合理。

  • 比例key_reads / key_read_requests应该尽可能的低,至少是1:100,1:1000更好。

  • show global status like '%created_tmp_disk_tables%';

  • key_buffer_size只对MyISAM表起作用。即使你不使用MyISAM表,但是内部的临时磁盘表是MyISAM表,也要使用该值。可以使用检查状态值created_tmp_disk_tables得知详情。

  • 对于1G内存的机器,如果不使用MyISAM表,推荐值是16M(8-64M)

  • 另一个参考如下

  • show global status like 'key_blocks_u%';

  • +------------------------+-------------+

  • | Variable_name | Value |

  • +------------------------+-------------+

  • | Key_blocks_unused | 0 |

  • | Key_blocks_used | 413543 |

  • +------------------------+-------------+

  • Key_blocks_unused表示未使用的缓存簇(blocks)数,Key_blocks_used表示曾经用到的最大的blocks数,比如这台服务器,所有的缓存都用到了,要么增加key_buffer_size,要么就是过渡索引了,把缓存占满了。比较理想的设置:

  • 可以根据此工式来动态的调整Key_blocks_used / (Key_blocks_unused + Key_blocks_used) * 100% ≈ 80%

  • show engines;

  • 查询存储引擎

  • innodb_buffer_pool_size (innodb索引用)

    这个参数和MyISAM的key_buffer_size有相唯指吵似之处,但也是有差别的。这个参数主要缓存innodb表的索引,数据,插入数据时的缓冲。为Innodb加速优化首要参数。

    该参数分配内存的原则:这个参数默认分配只有8M,可以说是非常小的一个值。

  • 如果是专用的DB服务器,且以InnoDB引擎为主的场景,通常可设置物理内存的50%,这个参数不能动态更改,所以分配需多考虑。分配过大,会使Swap占用过多,致使Mysql的查询特慢。

  • 如果是非专用DB服务器,可以先尝试设置成内存的1/4,如果有问题再调整

  • query_cache_size(查询缓存)

    缓存机制简单的说就是缓存sql文本及查询结果,如果运行相同的sql,服务器直接从缓存中取到结果,而不需要再去解析和执行sql。如果表更改了,那么使用这个表的所有缓冲查询将不再有效,查询缓存值的相关条目被清空。更改指的是表中任何数据或是结构的改变,包括INSERT、UPDATE、DELETE、TRUNCATE、ALTER TABLE、DROP TABLE或DROP DATABASE等,也包括那些映射到改变了的表的使用MERGE表的查询。显然,这对于频繁更新的表,查询缓存是不适合的,而对于一些不常改变数据且有大量相同sql查询的表,查询缓存会节约很大的性能。

  • 注意:如果你查询的表更新比较频繁,而且很少有相同的查询,最好不要使用查询缓存。因为这样会消耗很大的系统性能还没有任何的效果

  • 要不要打开?

    先设置成这样跑一段时间

  • query_cache_size=128M

  • query_cache_type=1

  • 看看命中结果来进行进一步的判断

  • mysql> show status like '%Qcache%';

  • +-------------------------+-----------+

  • | Variable_name | Value |

  • +-------------------------+-----------+

  • | Qcache_free_blocks | 669 |

  • | Qcache_free_memory | 132519160 |

  • | Qcache_hits | 1158 |

  • | Qcache_inserts | 284824 |

  • | Qcache_lowmem_prunes | 2741 |

  • | Qcache_not_cached | 1755767 |

  • | Qcache_queries_in_cache | 579 |

  • | Qcache_total_blocks | 1853 |

  • +-------------------------+-----------+8 rows in set (0.00 sec)

  • Qcache_free_blocks:表示查询缓存中目前还有多少剩余的blocks,如果该值显示较大,则说明查询缓存中的内存碎片过多了,可能在一定的时间进行整理。

    Qcache_free_memory:查询缓存的内存大小,通过这个参数可以很清晰的知道当前系统的查询内存是否够用,是多了,还是不够用,DBA可以根据实际情况做出调整。

    Qcache_hits:表示有多少次命中缓存。我们主要可以通过该值来验证我们的查询缓存的效果。数字越大,缓存效果越理想。

    Qcache_inserts: 表示多少次未命中然后插入,意思是新来的SQL请求在缓存中未找到,不得不执行查询处理,执行查询处理后把结果insert到查询缓存中。这样的情况的次数,次数越多,表示查询缓存应用到的比较少,效果也就不理想。当然系统刚启动后,查询缓存是空的,这很正常。

    Qcache_lowmem_prunes:该参数记录有多少条查询因为内存不足而被移除出查询缓存。通过这个值,用户可以适当的调整缓存大小。

    Qcache_not_cached: 表示因为query_cache_type的设置而没有被缓存的查询数量。

    Qcache_queries_in_cache:当前缓存中缓存的查询数量。

    Qcache_total_blocks:当前缓存的block数量。

  • 我们可以看到现网命中1158,未缓存的有1755767次,说明我们这个系统命中的太少了,表变动比较多,不什么开启这个功能涉及参数

  • query_cache_limit:允许 Cache 的单条 Query 结果集的最大容量,默认是1MB,超过此参数设置的 Query 结果集将不会被 Cache

  • query_cache_min_res_unit:设置 Query Cache 中每次分配内存的最小空间大小,也就是每个 Query 的 Cache 最小占用的内存空间大小

  • query_cache_size:设置 Query Cache 所使用的内存大小,默认值为0,大小必须是1024的整数倍,如果不是整数倍,MySQL 会自动调整降低最小量以达到1024的倍数

  • query_cache_type:控制 Query Cache 功能的开关,可以设置为0(OFF),1(ON)和2(DEMAND)三种,意义分别如下: 0(OFF):关闭 Query Cache 功能,任何情况下都不会使用 Query Cache 1(ON):开启 Query Cache 功能,但是当 SELECT 语句中使用的 SQL_NO_CACHE 提示后,将不使用Query Cache 2(DEMAND):开启 Query Cache 功能,但是只有当 SELECT 语句中使用了 SQL_CACHE 提示后,才使用 Query Cache

  • query_cache_wlock_invalidate:控制当有写锁定发生在表上的时刻是否先失效该表相关的 Query Cache,如果设置为 1(TRUE),则在写锁定的同时将失效该表相关的所有 Query Cache,如果设置为0(FALSE)则在锁定时刻仍然允许读取该表相关的 Query Cache。

  • innodb_additional_mem_pool_size(InnoDB内部目录大小)

    InnoDB 字典信息缓存主要用来存放 InnoDB 存储引擎的字典信息以及一些 internal 的共享数据结构信息,也就是存放Innodb的内部目录,所以其大小也与系统中所使用的 InnoDB 存储引擎表的数量有较大关系。

    这个值不用分配太大,通常设置16M够用了,默认8M,如果设置的内存大小不够,InnoDB 会自动申请更多的内存,并在 MySQL 的 Error Log 中记录警告信息。

    innodb_log_buffer_size (日志缓冲)

    表示InnoDB写入到磁盘上的日志文件时使用的缓冲区的字节数,默认值为16M。一个大的日志缓冲区允许大量的事务在提交之前不用写日志到磁盘,所以如果有更新,插入或删除许多行的事务,则使日志缓冲区更大一些可以节省磁盘IO

    通常最大设为64M足够

    max_connections (最大并发连接)

    MySQL的max_connections参数用来设置最大连接(用户)数。每个连接MySQL的用户均算作一个连接,max_connections的默认值为100。

  • 这个参数实际起作用的最大值(实际最大可连接数)为16384,即该参数最大值不能超过16384,即使超过也以16384为准;

  • 增加max_connections参数的值,不会占用太多系统资源。系统资源(CPU、内存)的占用主要取决于查询的密度、效率等;

  • 该参数设置过小的最明显特征是出现”Too many connections”错误

  • mysql> show variables like '%max_connect%';

  • +-----------------------+-------+

  • | Variable_name | Value |

  • +-----------------------+-------+

  • | extra_max_connections | 1 |

  • | max_connect_errors | 100 |

  • | max_connections | 2048 |

  • +-----------------------+-------+3 rows in set (0.00 sec)


  • mysql> show status like 'Threads%';

  • +-------------------+---------+

  • | Variable_name | Value |

  • +-------------------+---------+

  • | Threads_cached | 0 |

  • | Threads_connected | 1 |

  • | Threads_created | 9626717 |

  • | Threads_running | 1 |

  • +-------------------+---------+4 rows in set (0.00 sec)

  • 可以看到此时的并发数也就是Threads_connected=1,还远远达不到2048

  • mysql> show variables like 'open_files_limit';

  • +------------------+-------+

  • | Variable_name | Value |

  • +------------------+-------+

  • | open_files_limit | 65535 |

  • +------------------+-------+1 row in set (0.00 sec)

  • max_connections 还取决于操作系统对单进程允许打开最大文件数的限制

    也就是说如果操作系统限制单个进程最大可以打开100个文件

    那么 max_connections 设置为200也没什么用

    MySQL 的 open_files_limit 参数值是在MySQL启动时记录的操作系统对单进程打开最大文件数限制的值

    可以使用 show variables like 'open_files_limit'; 查看 open_files_limit 值

  • ulimit -n65535

  • 或者直接在 Linux 下通过ulimit -n命令查看操作系统对单进程打开最大文件数限制 ( 默认为1024 )

    connection级内存参数(线程独享)

    connection级参数,是在每个connection第一次需要使用这个buffer的时候,一次性分配设置的内存。

    排序性能

    mysql对于排序,使用了两个变量来控制sort_buffer_size和 max_length_for_sort_data, 不象oracle使用SGA控制. 这种方式的缺点是要单独控制,容易出现排序性能问题.

  • mysql> SHOW GLOBAL STATUS like '%sort%';

  • +---------------------------+--------+

  • | Variable_name | Value |

  • +---------------------------+--------+

  • | Sort_merge_passes | 0 |

  • | Sort_priority_queue_sorts | 1409 |

  • | Sort_range | 0 |

  • | Sort_rows | 843479 |

  • | Sort_scan | 13053 |

  • +---------------------------+--------+5 rows in set (0.00 sec)

  • 如果发现Sort_merge_passes的值比较大,你可以考虑增加sort_buffer_size来加速ORDER BY 或者GROUP BY 操作,不能通过查询或者索引优化的。我们这为0,那就没必要设置那么大。

  • 读取缓存

    read_buffer_size = 128K(默认128K)为需要全表扫描的MYISAM数据表线程指定缓存

    read_rnd_buffer_size = 4M:(默认256K)首先,该变量可以被任何存储引擎使用,当从一个已经排序的键值表中读取行时,会先从该缓冲区中获取而不再从磁盘上获取。

    大事务binlog

  • mysql> show global status like 'binlog_cache%';

  • +-----------------------+----------+

  • | Variable_name | Value |

  • +-----------------------+----------+

  • | Binlog_cache_disk_use | 220840 |

  • | Binlog_cache_use | 67604667 |

  • +-----------------------+----------+2 rows in set (0.00 sec)

  • Binlog_cache_disk_use表示因为我们binlog_cache_size设计的内存不足导致缓存二进制日志用到了临时文件的次数

  • Binlog_cache_use 表示 用binlog_cache_size缓存的次数

  • 当对应的Binlog_cache_disk_use 值比较大的时候 我们可以考虑适当的调高 binlog_cache_size 对应的值

  • 如上图,现网是32K,我们加到64K

  • join语句内存影响

    如果应用中,很少出现join语句,则可以不用太在乎join_buffer_size参数的设置大小。

    如果join语句不是很少的话,个人建议可以适当增大join_buffer_size到1MB左右,如果内存充足可以设置为2MB。

    线程内存影响

    Thread_stack:每个连接线程被创建时,MySQL给它分配的内存大小。当MySQL创建一个新的连接线程时,需要给它分配一定大小的内存堆栈空间,以便存放客户端的请求的Query及自身的各种状态和处理信息。

  • mysql> show status like '%threads%';

  • +-------------------------+---------+

  • | Variable_name | Value |

  • +-------------------------+---------+

  • | Delayed_insert_threads | 0 |

  • | Slow_launch_threads | 0 |

  • | Threadpool_idle_threads | 0 |

  • | Threadpool_threads | 0 |

  • | Threads_cached | 0 |

  • | Threads_connected | 1 |

  • | Threads_created | 9649301 |

  • | Threads_running | 1 |

  • +-------------------------+---------+8 rows in set (0.00 sec)


  • mysql> show status like 'connections';

  • +---------------+---------+

  • | Variable_name | Value |

  • +---------------+---------+

  • | Connections | 9649311 |

  • +---------------+---------+1 row in set (0.00 sec)

  • 如上:系统启动到现在共接受到客户端的连接9649311次,共创建了9649301个连接线程,当前有1个连接线程处于和客户端连接的状态。而在Thread Cache池中共缓存了0个连接线程(Threads_cached)。

    Thread Cache 命中率:

  • Thread_Cache_Hit = (Connections - Threads_created) / Connections * 100%;

  • 一般在系统稳定运行一段时间后,Thread Cache命中率应该保持在90%左右才算正常。

    内存临时表

    tmp_table_size 控制内存临时表的最大值,超过限值后就往硬盘写,写的位置由变量 tmpdir 决定

    max_heap_table_size 用户可以创建的内存表(memory table)的大小.这个值用来计算内存表的最大行数值。

    Order By 或者Group By操作多的话,加大这两个值,默认16M

  • mysql> show status like 'Created_tmp_%';

  • +-------------------------+-------+

  • | Variable_name | Value |

  • +-------------------------+-------+

  • | Created_tmp_disk_tables | 0 |

  • | Created_tmp_files | 626 |

  • | Created_tmp_tables | 3 |

  • +-------------------------+-------+3 rows in set (0.00 sec)

  • 如上图,写入硬盘的为0,3次中间表,说明我们的默认值足够用了

  • mariadb 推荐配置

  • 注意这里只推荐innodb引擎

  • 内存配置只关注有注释的行

  • [mysqld]

  • datadir=/var/lib/mysql

  • socket=/var/lib/mysql/mysql.sockdefault-storage-engine=INNODB


  • character-set-server=utf8

  • collation-server=utf8_general_ci


  • user=mysql

  • symbolic-links=0# global settings

  • table_cache=65535table_definition_cache=65535max_allowed_packet=4M

  • net_buffer_length=1M

  • bulk_insert_buffer_size=16M


  • query_cache_type=0 #是否使用查询缓冲,0关闭

  • query_cache_size=0 #0关闭,因为改表操作多,命中低,开启消耗cpu


  • # shared

  • key_buffer_size=8M #保持8M MyISAM索引用

  • innodb_buffer_pool_size=4G #DB专用mem*50%,非DB专用mem*15%到25%

  • myisam_sort_buffer_size=32M

  • max_heap_table_size=16M #最大中间表大小

  • tmp_table_size=16M #中间表大小


  • # per-thread

  • sort_buffer_size=256K #加速排序缓存大小

  • read_buffer_size=128k #为需要全表扫描的MYISAM数据表线程指定缓存

  • read_rnd_buffer_size=4M #已排序的表读取时缓存,如果比较大内存就到6M

  • join_buffer_size=1M #join语句多时加大,1-2M

  • thread_stack=256k #线程空间,256K or 512K

  • binlog_cache_size=64K #大事务binlog



  • # big-tables

  • innodb_file_per_table = 1skip-external-locking

  • max_connections=2048 #最大连接数

  • skip-name-resolve


  • # slow_query_log

  • slow_query_log_file = /var/log/mysql-slow.log

  • long_query_time = 30group_concat_max_len=65536# according to tuning-primer.sh

  • thread_cache_size = 8thread_concurrency = 16# set variables

  • concurrent_insert=2

  • 运行时修改

    使用以下命令来修改变量

  • set global {要改的key} = {值}; (立即生效重启后失效)

  • set @@{要改的key} = {值}; (立即生效重启后失效)

  • set @@global.{要改的key} = {值}; (立即生效重启后失效)

  • 试验

  • mysql> set @@global.innodb_buffer_pool_size=4294967296;

  • ERROR 1238 (HY000): Variable 'innodb_buffer_pool_size' is a read only variable

  • mysql> set @@global.thread_stack=262144;

  • ERROR 1238 (HY000): Variable 'thread_stack' is a read only variable

  • mysql> set @@global.binlog_cache_size=65536;

  • Query OK, 0 rows affected (0.00 sec)

  • mysql> set @@join_buffer_size=1048576;

  • Query OK, 0 rows affected (0.00 sec)

  • mysql> set @@read_rnd_buffer_size=4194304;

  • Query OK, 0 rows affected (0.00 sec)

  • mysql> set @@sort_buffer_size=262144;

  • Query OK, 0 rows affected (0.00 sec)

  • mysql> set @@read_buffer_size=131072;

  • Query OK, 0 rows affected (0.00 sec)

  • mysql> set global key_buffer_size=8388608;

  • Query OK, 0 rows affected (0.39 sec)

  • 我们可以看到innodb_buffer_pool_size和thread_stack报错了,他们只能改配置文件,在运行时是只读的。 以下直接复制使用

  • set @@global.binlog_cache_size=65536;

  • set @@join_buffer_size=1048576;

  • set @@read_rnd_buffer_size=4194304;

  • set @@sort_buffer_size=262144;

  • set @@read_buffer_size=131072;

  • set global key_buffer_size=8388608;

‘贰’ myisam索引缓冲区大小 怎么设置

MyISAM:这个是默认类型,它是基于传统的ISAM类型,ISAM是Indexed Sequential Access Method (有索引的 顺序访问方法) 的缩写,它是存储记录和文件的标准方法.与其他存储引擎比较,MyISAM具有检查和修复表格的大多数工具. MyISAM表格可以被压缩,而且它们支持全文搜索.它们不是事务安全的,而且也不支持外键。如果事物回滚将造成不完全回滚,不具有原子性。如果执行大量 的SELECT,MyISAM是更好的选择。

‘叁’ mysql 8.0 为什么 要废弃myisam

InnoDB存储数据字典,这意味着MyISAM已经可以完全从MySQL数据库中剥离;
Invisible Index,Inside君对这个特性非常感兴趣。因为在生产环境中,可以通过sys库判断哪些索引是冗余的。但是要直接删除冗余索引又担心会存在一些风险。Invisible Index给了我们很好的选择;
角色表功能,官方MySQL终于提供了Role功能。InnoSQL傲娇的表示我们在5.5就实现了此功能,甚至比MariaDB还要早。要知道在游戏行业,定期密码修改总是一个令人头疼的问题,有Role就简单多了。当然,InnoSQL还可以对Role进行资源控制,不知道8.0实现的怎样;

Cost Model改进,优化器能够感知到页是否存在缓冲池中。5.7其实已经开放接口,但是不对内存中的页进行统计,返回都是1.0;

直巧巧方图支持,MySQL也支持直方图啦。应该会有更好的执行计划。海翔兄在IMG大会中说到过此特性,听说性能提升非常不错;
参数持久化,继续与Oracle数据库靠近,但本身这个特性就是硬需求。话说这些年有多少因为没有参数持久化导致的坑发生;
扫描性能的改进,InnoDB全表扫描或范围查询性能提升5%~20%。请问之前HT写的代码有这么烂?

重构BLOB的实现,从而提升JSON属性的更新。个人感觉这方面性能的提升可能会非常大。留个爪,后孝燃键面进行测试;
持久化自增值,这些年淘宝、Percona都做过类似的改进。但是官方的修改段橘就是优雅,自增写redo,一个历史遗留难题就这么简单而又优雅的解决了;

PS库添加索引,官方宣称添加了100多个索引。的确,Inside君遇到过很多时候PS库占用20G内存的场景,这时查询就会显得非常不高效。但是内存开销会不会进一步提升呢?让我们拭目以待吧;

‘肆’ MSSQL Server 自定义的函数

[client]
port = 3306
socket = /tmp/mysql.sock
[mysqld]
port = 3306
socket = /tmp/mysql.sock

basedir = /usr/local/mysql
datadir = /data/mysql
pid-file = /data/mysql/mysql.pid
user = mysql
bind-address = 0.0.0.0
server-id = 1 #表示是本机的序号为1,一般来讲就是master的意思

skip-name-resolve
# 禁止MySQL对外部连接进行DNS解析,使用这一选项可以消除MySQL进行DNS解析的时间。但需要注意,如果开启该选项,
# 则所有远程主机连接授权都要使用IP地址方式,否则MySQL将无法正常处理连接请求

#skip-networking

back_log = 600
# MySQL能有的连接数量。当主要MySQL线程在一个很短时间内得到非常多的连接请求,这就起作用,
# 然后主线程花些时间(尽管很短)检查连接并且启动一个新线程。back_log值指出在MySQL暂时停止回答新请求之前的短时间内多少个请求可以被存在堆栈中。
# 如果期望在一个短时间内有很多连接,你需要增加它。也就是说,如果MySQL的连接数据达到max_connections时,新来的请求将会被存在堆栈中,
# 以等待某一连接释放资源,该堆栈的数量即back_log,如果等待连接的数量超过back_log,将不被授予连接资源。
# 另外,这值(back_log)限于您的操作系统对到来的TCP/IP连接的侦听队列的大小。
# 你的操作系统在这个队列大小上有它自己的限制(可以检查你的OS文档找出这个变量的最大值),试图设定back_log高于你的操作系统的限制将是无效的。

max_connections = 1000
#
MySQL的最大连接数,如果服务器的并发连接请求量比较大,建议调高此值,以增加并行连接数量,当然这建立在机器能支撑的情况下,因为如果扒谈誉连接数越多,
介于MySQL会为每个连接提供连接缓冲区,就会开销越多的内存,所以要适当调整该值,不能盲目提高设值。可以过'conn%'通配符查看当前状态的连接
数量,以定夺该值的大小。

max_connect_errors = 6000
# 对于同一主机,如果有超出该参数值个数的春段中断错误连接,则该主机将被禁止连接。如需对该主机进行解禁,执行:FLUSH HOST。

open_files_limit = 65535
# MySQL打开的文件描述符限制,默认最小1024;当open_files_limit没有被配置的时候,比较max_connections*5和ulimit -n的值,哪个大用哪个,
# 当open_file_limit被配置的时候,比较侍巧open_files_limit和max_connections*5的值,哪个大用哪个。

table_open_cache = 128
# MySQL每打开一个表,都会读入一些数据到table_open_cache缓存中,当MySQL在这个缓存中找不到相应信息时,才会去磁盘上读取。默认值64
# 假定系统有200个并发连接,则需将此参数设置为200*N(N为每个连接所需的文件描述符数目);
# 当把table_open_cache设置为很大时,如果系统处理不了那么多文件描述符,那么就会出现客户端失效,连接不上

max_allowed_packet = 4M
# 接受的数据包大小;增加该变量的值十分安全,这是因为仅当需要时才会分配额外内存。例如,仅当你发出长查询或MySQLd必须返回大的结果行时MySQLd才会分配更多内存。
# 该变量之所以取较小默认值是一种预防措施,以捕获客户端和服务器之间的错误信息包,并确保不会因偶然使用大的信息包而导致内存溢出。

binlog_cache_size = 1M
# 一个事务,在没有提交的时候,产生的日志,记录到Cache中;等到事务提交需要提交的时候,则把日志持久化到磁盘。默认binlog_cache_size大小32K

max_heap_table_size = 8M
# 定义了用户可以创建的内存表(memory table)的大小。这个值用来计算内存表的最大行数值。这个变量支持动态改变

tmp_table_size = 16M
# MySQL的heap(堆积)表缓冲大小。所有联合在一个DML指令内完成,并且大多数联合甚至可以不用临时表即可以完成。
# 大多数临时表是基于内存的(HEAP)表。具有大的记录长度的临时表 (所有列的长度的和)或包含BLOB列的表存储在硬盘上。
#

如果某个内部heap(堆积)表大小超过tmp_table_size,MySQL可以根据需要自动将内存中的heap表改为基于硬盘的MyISAM表。
还可以通过设置tmp_table_size选项来增加临时表的大小。也就是说,如果调高该值,MySQL同时将增加heap表的大小,可达到提高联接查
询速度的效果

read_buffer_size = 2M
# MySQL读入缓冲区大小。对表进行顺序扫描的请求将分配一个读入缓冲区,MySQL会为它分配一段内存缓冲区。read_buffer_size变量控制这一缓冲区的大小。
# 如果对表的顺序扫描请求非常频繁,并且你认为频繁扫描进行得太慢,可以通过增加该变量值以及内存缓冲区大小提高其性能

read_rnd_buffer_size = 8M
# MySQL的随机读缓冲区大小。当按任意顺序读取行时(例如,按照排序顺序),将分配一个随机读缓存区。进行排序查询时,
# MySQL会首先扫描一遍该缓冲,以避免磁盘搜索,提高查询速度,如果需要排序大量数据,可适当调高该值。但MySQL会为每个客户连接发放该缓冲空间,所以应尽量适当设置该值,以避免内存开销过大

sort_buffer_size = 8M
# MySQL执行排序使用的缓冲大小。如果想要增加ORDER BY的速度,首先看是否可以让MySQL使用索引而不是额外的排序阶段。
# 如果不能,可以尝试增加sort_buffer_size变量的大小

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

thread_cache_size = 8
# 这个值(默认8)表示可以重新利用保存在缓存中线程的数量,当断开连接时如果缓存中还有空间,那么客户端的线程将被放到缓存中,
# 如果线程重新被请求,那么请求将从缓存中读取,如果缓存中是空的或者是新的请求,那么这个线程将被重新创建,如果有很多新的线程,
# 增加这个值可以改善系统性能.通过比较Connections和Threads_created状态的变量,可以看到这个变量的作用。(–>表示要调整的值)
# 根据物理内存设置规则如下:
# 1G —> 8
# 2G —> 16
# 3G —> 32
# 大于3G —> 64

query_cache_size = 8M
#MySQL的查询缓冲大小(从4.0.1开始,MySQL提供了查询缓冲机制)使用查询缓冲,MySQL将SELECT语句和查询结果存放在缓冲区中,
# 今后对于同样的SELECT语句(区分大小写),将直接从缓冲区中读取结果。根据MySQL用户手册,使用查询缓冲最多可以达到238%的效率。
# 通过检查状态值'Qcache_%',可以知道query_cache_size设置是否合理:如果Qcache_lowmem_prunes的值非常大,则表明经常出现缓冲不够的情况,
# 如果Qcache_hits的值也非常大,则表明查询缓冲使用非常频繁,此时需要增加缓冲大小;如果Qcache_hits的值不大,则表明你的查询重复率很低,
# 这种情况下使用查询缓冲反而会影响效率,那么可以考虑不用查询缓冲。此外,在SELECT语句中加入SQL_NO_CACHE可以明确表示不使用查询缓冲

query_cache_limit = 2M
#指定单个查询能够使用的缓冲区大小,默认1M

key_buffer_size = 4M
#指定用于索引的缓冲区大小,增加它可得到更好处理的索引(对所有读和多重写),到你能负担得起那样多。如果你使它太大,
# 系统将开始换页并且真的变慢了。对于内存在4GB左右的服务器该参数可设置为384M或512M。通过检查状态值Key_read_requests和Key_reads,
# 可以知道key_buffer_size设置是否合理。比例key_reads/key_read_requests应该尽可能的低,
# 至少是1:100,1:1000更好(上述状态值可以使用SHOW STATUS LIKE 'key_read%'获得)。注意:该参数值设置的过大反而会是服务器整体效率降低

ft_min_word_len = 4
# 分词词汇最小长度,默认4

transaction_isolation = REPEATABLE-READ
# MySQL支持4种事务隔离级别,他们分别是:
# READ-UNCOMMITTED, READ-COMMITTED, REPEATABLE-READ, SERIALIZABLE.
# 如没有指定,MySQL默认采用的是REPEATABLE-READ,ORACLE默认的是READ-COMMITTED

log_bin = mysql-bin
binlog_format = mixed
expire_logs_days = 30 #超过30天的binlog删除

log_error = /data/mysql/mysql-error.log #错误日志路径
slow_query_log = 1
long_query_time = 1 #慢查询时间 超过1秒则为慢查询
slow_query_log_file = /data/mysql/mysql-slow.log

performance_schema = 0
explicit_defaults_for_timestamp

#lower_case_table_names = 1 #不区分大小写

skip-external-locking #MySQL选项以避免外部锁定。该选项默认开启

default-storage-engine = InnoDB #默认存储引擎

innodb_file_per_table = 1
# InnoDB为独立表空间模式,每个数据库的每个表都会生成一个数据空间
# 独立表空间优点:
# 1.每个表都有自已独立的表空间。
# 2.每个表的数据和索引都会存在自已的表空间中。
# 3.可以实现单表在不同的数据库中移动。
# 4.空间可以回收(除drop table操作处,表空不能自已回收)
# 缺点:
# 单表增加过大,如超过100G
# 结论:
# 共享表空间在Insert操作上少有优势。其它都没独立表空间表现好。当启用独立表空间时,请合理调整:innodb_open_files

innodb_open_files = 500
# 限制Innodb能打开的表的数据,如果库里的表特别多的情况,请增加这个。这个值默认是300

innodb_buffer_pool_size = 64M
# InnoDB使用一个缓冲池来保存索引和原始数据, 不像MyISAM.
# 这里你设置越大,你在存取表里面数据时所需要的磁盘I/O越少.
# 在一个独立使用的数据库服务器上,你可以设置这个变量到服务器物理内存大小的80%
# 不要设置过大,否则,由于物理内存的竞争可能导致操作系统的换页颠簸.
# 注意在32位系统上你每个进程可能被限制在 2-3.5G 用户层面内存限制,
# 所以不要设置的太高.

innodb_write_io_threads = 4
innodb_read_io_threads = 4
# innodb使用后台线程处理数据页上的读写 I/O(输入输出)请求,根据你的 CPU 核数来更改,默认是4
# 注:这两个参数不支持动态改变,需要把该参数加入到my.cnf里,修改完后重启MySQL服务,允许值的范围从 1-64

innodb_thread_concurrency = 0
# 默认设置为 0,表示不限制并发数,这里推荐设置为0,更好去发挥CPU多核处理能力,提高并发量

innodb_purge_threads = 1
# InnoDB中的清除操作是一类定期回收无用数据的操作。在之前的几个版本中,清除操作是主线程的一部分,这意味着运行时它可能会堵塞其它的数据库操作。
# 从MySQL5.5.X版本开始,该操作运行于独立的线程中,并支持更多的并发数。用户可通过设置innodb_purge_threads配置参数来选择清除操作是否使用单
# 独线程,默认情况下参数设置为0(不使用单独线程),设置为 1 时表示使用单独的清除线程。建议为1

innodb_flush_log_at_trx_commit = 2
# 0:如果innodb_flush_log_at_trx_commit的值为0,log buffer每秒就会被刷写日志文件到磁盘,提交事务的时候不做任何操作(执行是由mysql的master thread线程来执行的。
# 主线程中每秒会将重做日志缓冲写入磁盘的重做日志文件(REDO LOG)中。不论事务是否已经提交)默认的日志文件是ib_logfile0,ib_logfile1
# 1:当设为默认值1的时候,每次提交事务的时候,都会将log buffer刷写到日志。
# 2:如果设为2,每次提交事务都会写日志,但并不会执行刷的操作。每秒定时会刷到日志文件。要注意的是,并不能保证100%每秒一定都会刷到磁盘,这要取决于进程的调度。
# 每次事务提交的时候将数据写入事务日志,而这里的写入仅是调用了文件系统的写入操作,而文件系统是有 缓存的,所以这个写入并不能保证数据已经写入到物理磁盘
# 默认值1是为了保证完整的ACID。当然,你可以将这个配置项设为1以外的值来换取更高的性能,但是在系统崩溃的时候,你将会丢失1秒的数据。
# 设为0的话,mysqld进程崩溃的时候,就会丢失最后1秒的事务。设为2,只有在操作系统崩溃或者断电的时候才会丢失最后1秒的数据。InnoDB在做恢复的时候会忽略这个值。
# 总结
# 设为1当然是最安全的,但性能页是最差的(相对其他两个参数而言,但不是不能接受)。如果对数据一致性和完整性要求不高,完全可以设为2,如果只最求性能,例如高并发写的日志服务器,设为0来获得更高性能

innodb_log_buffer_size = 2M
# 此参数确定些日志文件所用的内存大小,以M为单位。缓冲区更大能提高性能,但意外的故障将会丢失数据。MySQL开发人员建议设置为1-8M之间

innodb_log_file_size = 32M
# 此参数确定数据日志文件的大小,更大的设置可以提高性能,但也会增加恢复故障数据库所需的时间

innodb_log_files_in_group = 3
# 为提高性能,MySQL可以以循环方式将日志文件写到多个文件。推荐设置为3

innodb_max_dirty_pages_pct = 90
# innodb主线程刷新缓存池中的数据,使脏数据比例小于90%

innodb_lock_wait_timeout = 120
# InnoDB事务在被回滚之前可以等待一个锁定的超时秒数。InnoDB在它自己的锁定表中自动检测事务死锁并且回滚事务。InnoDB用LOCK TABLES语句注意到锁定设置。默认值是50秒

bulk_insert_buffer_size = 8M
# 批量插入缓存大小, 这个参数是针对MyISAM存储引擎来说的。适用于在一次性插入100-1000+条记录时, 提高效率。默认值是8M。可以针对数据量的大小,翻倍增加。

myisam_sort_buffer_size = 8M
# MyISAM设置恢复表之时使用的缓冲区的尺寸,当在REPAIR TABLE或用CREATE INDEX创建索引或ALTER TABLE过程中排序 MyISAM索引分配的缓冲区

myisam_max_sort_file_size = 10G
# 如果临时文件会变得超过索引,不要使用快速排序索引方法来创建一个索引。注释:这个参数以字节的形式给出

myisam_repair_threads = 1
# 如果该值大于1,在Repair by sorting过程中并行创建MyISAM表索引(每个索引在自己的线程内)

interactive_timeout = 28800
# 服务器关闭交互式连接前等待活动的秒数。交互式客户端定义为在mysql_real_connect()中使用CLIENT_INTERACTIVE选项的客户端。默认值:28800秒(8小时)

wait_timeout = 28800
# 服务器关闭非交互连接之前等待活动的秒数。在线程启动时,根据全局wait_timeout值或全局interactive_timeout值初始化会话wait_timeout值,
# 取决于客户端类型(由mysql_real_connect()的连接选项CLIENT_INTERACTIVE定义)。参数默认值:28800秒(8小时)
# MySQL服务器所支持的最大连接数是有上限的,因为每个连接的建立都会消耗内存,因此我们希望客户端在连接到MySQL Server处理完相应的操作后,
# 应该断开连接并释放占用的内存。如果你的MySQL Server有大量的闲置连接,他们不仅会白白消耗内存,而且如果连接一直在累加而不断开,
# 最终肯定会达到MySQL Server的连接上限数,这会报'too many connections'的错误。对于wait_timeout的值设定,应该根据系统的运行情况来判断。
# 在系统运行一段时间后,可以通过show processlist命令查看当前系统的连接状态,如果发现有大量的sleep状态的连接进程,则说明该参数设置的过大,
# 可以进行适当的调整小些。要同时设置interactive_timeout和wait_timeout才会生效。

[mysqlmp]
quick
max_allowed_packet = 16M #服务器发送和接受的最大包长度
[myisamchk]
key_buffer_size = 8M
sort_buffer_size = 8M
read_buffer = 4M
write_buffer = 4M

‘伍’ mysql的innodb和myisam的区别

MYISAM 表是典型的数据与索引分离存储,主键和二级索引没有本质区别。比如在 MYISAM 表里主键、唯一索引是一样的,没有本质区别。
MYISAM 表的索引存储方式最大的缺点没有按照物理数据行顺序存储,这样无论对主键的检索还是对二级索引的检索都需要进行二次排序。兄做
INNODB 表本身是索引组织表,也就是说索引就是数据。下图表T1的数据行以聚簇索引的方式展示,非叶子节点保存了主键的值,叶子节点保存了主键的值顷旁以及对应的数据行,并且每个页有分别指向前后两页的指针。
INNODB 表不同于 MYISAM,INNODB 表有自己的数据页管理,默认 16KB。MYISAM 表数据的管理依赖文件系统,比如文件系统一般默认 4KB,MYISAM 的块大小也是 4KB,MYISAM 表的没有自己的一套崩溃恢复机制,全部依赖于文件系统。
INNODB 表这样设计的优点有两个:
1. 数据按照主键顺序存储。主键的顺序也就是记录行的物理顺序,相比指向数据行指针的存放方式,避免了再次排序。
2. 两个叶子节点分别含有指向前后两个节点的指针,这样在插入新行或者进行页分裂时,只需要移动对应的指针即可。
但是也有缺点:
1. 二级索引由于同时保存了主键值,体积会变大。特别是主键设计不合理的时候,比如用 UUID 做主键。
2. 对二级索引的检索需要检索两羡乎衡次索引树。第一次通过检索二级索引叶子节点,找到过滤行对应的主键值;第二次通过这个主键的值去聚簇索引中查找对应的行。

‘陆’ mysql修改数据表存储引擎为MyISAM

先将数据库导出啊,搞成SQL脚本
然后吧INNODB替换成MYISAM- -
我以前是这么做的
但是INNODB好用得多啊- -~~~
好像没有更好的办法了,批量改不这样做的话那就是自己写脚本?那对于数据库本身而言更麻烦,中间会产生很多问题......

可不可以先导出结构,在另一台服务器上把结构修改好之后然后做个COPY或者是热备?

而且INNODB参数设置得当的情况下效率也差不了多少,在大并发量的情况下性能完全优于MYISAM引擎的,特别是行级锁这东西.....很好用

‘柒’ 如何用redis/memcache做Mysql缓存层

有两种方法,一种方法使用mysql的check table和repair table 的sql语句,另一种方法是使用MySQL提供的多个myisamchk, isamchk数据检测恢复工具。前者使用起来比较简便。推荐使用。
1. check table 和 repair table
登陆mysql 终端:
mysql -uxxxxx -p dbname
check table tabTest;
如果出现的结果说Status是OK,则不用修复,如果有Error,可以用:
repair table tabTest;
进行修复,修复之后可以在用check table命令来进行检查。在新版本的phpMyAdmin里面也可以使用check/repair的功能。
2. myisamchk, isamchk
其中myisamchk适用于MYISAM类型的数枣绝据表,而isamchk适用于ISAM类型的数据表。这两条命令的主要参数相同,一般新的系统都使用MYISAM作为缺省的数据表类型,这里以myisamchk为例子进行说明。当发现某个数据表出现问题时可以使用:
myisamchk tablename.MYI
进行检测,如果需要修复的话,凳粗姿可以使用:
myisamchk -of tablename.MYI
关于myisamchk的详细参数说明,可以参见它的使用帮助。需要注意的时在进行修改时必须确保MySQL服务器没有访问这个数据表,保险的情况下是最好在进行检测时把MySQL服务器Shutdown掉。
-----------------------------
另外可以把下面的命令放在你的rc.local里面启动MySQL服务器前:
[ -x /tmp/mysql.sock ] && /pathtochk/myisamchk -of /DATA_DIR/*/*.MYI
其中的/tmp/mysql.sock是MySQL监听的Sock文件位置,对于使用RPM安装的用户应该是/var/lib/mysql/mysql.sock,对于使用源码安装则是/tmp/mysql.sock可以根据自己凳慎的实际情况进行变更,而pathtochk则是myisamchk所在的位置,DATA_DIR是你的MySQL数据库存放的位置。
需要注意的时,如果你打算把这条命令放在你的rc.local里面,必须确认在执行这条指令时MySQL服务器必须没有启动!检测修复所有数据库(表)

‘捌’ mysql存储引擎类型有哪些

1、MyISAM

使用这个存储引擎,每个MyISAM在磁盘上存储成三个文件。

(1)frm文件:存储表的定义数据

(2)MYD文件:存放表具体记录的数据

(3)MYI文件:存储索引

frm和MYI可以存放在不同的目录下。MYI文件用来存储索引,但仅保存记录所在页的指针,索引的结构是B+树结构。下面这张图就是MYI文件保存的机制:

从这张图可以发现,这个存储引擎通过MYI的B+树结构来查找记录页,再根据记录页查找记录。并且支持全文索引、B树索引和数据压缩。

支持数据的类型也有三种:

(1)静态固定长度表

这种方式的优点在于存储速度非常快,容易发生缓存,而且表发生损坏后也容易修复。缺点是占空间。这也是默认的存储格式。

(2)动态可变长表

优点是节省空间,但是一旦出错恢复起来比较麻烦。

(3)压缩表

上面说到支持数据压缩,说明肯定也支持这个格式。在数据文件发生错误时候,可以使用check table工具来检查,而且还可以使用repair table工具来恢复。

有一个重要的特点那就是不支持事务,但是这也意味着他的存储速度更快,如果你的读写操作允许有错误数据的话,只是追求速度,可以选择这个存储引擎。

2、InnoDB

InnoDB是默认的数据库存储引擎,他的主要特点有:

(1)可以通过自动增长列,方法是auto_increment。

(2)支持事务。默认的事务隔离级别为可重复度,通过MVCC(并发版本控制)来实现的。

(3)使用的锁粒度为行级锁,可以支持更高的并发;

(4)支持外键约束;外键约束其实降低了表的查询速度,但是增加了表之间的耦合度。

(5)配合一些热备工具可以支持在线热备份;

(6)在InnoDB中存在着缓冲管理,通过缓冲池,将索引和数据全部缓存起来,加快查询的速度;

(7)对于InnoDB类型的表,其数据的物理组织形式是聚簇表。所有的数据按照主键来组织。数据和索引放在一块,都位于B+数的叶子节点上;

当然InnoDB的存储表和索引也有下面两种形式:

(1)使用共享表空间存储:所有的表和索引存放在同一个表空间中。

(2)使用多表空间存储:表结构放在frm文件,数据和索引放在IBD文件中。分区表的话,每个分区对应单独的IBD文件,分区表的定义可以查看我的其他文章。使用分区表的好处在于提升查询效率。

对于InnoDB来说,最大的特点在于支持事务。但是这是以损失效率来换取的。

3、Memory

将数据存在内存,为了提高数据的访问速度,每一个表实际上和一个磁盘文件关联。文件是frm。

(1)支持的数据类型有限制,比如:不支持TEXT和BLOB类型,对于字符串类型的数据,只支持固定长度的行,VARCHAR会被自动存储为CHAR类型;

(2)支持的锁粒度为表级锁。所以,在访问量比较大时,表级锁会成为MEMORY存储引擎的瓶颈;

(3)由于数据是存放在内存中,一旦服务器出现故障,数据都会丢失;

(4)查询的时候,如果有用到临时表,而且临时表中有BLOB,TEXT类型的字段,那么这个临时表就会转化为MyISAM类型的表,性能会急剧降低;

(5)默认使用hash索引。

(6)如果一个内部表很大,会转化为磁盘表。

在这里只是给出3个常见的存储引擎。使用哪一种引擎需要灵活选择,一个数据库中多个表可以使用不同引擎以满足各种性能和实际需求,使用合适的存储引擎,将会提高整个数据库的性能

‘玖’ 请论述下mysql中innodb和myisam的区别和优劣

InnoDB和MyISAM是在使用MySQL最常用的两个表类型,各有优缺点,视具体应用而定。
下面是已知的两者之间的差别,仅乱基供参考。

innodb
InnoDB 给 MySQL 提供了具有事务(commit)、回滚(rollback)和崩溃修复能力
(crash recovery capabilities)的事务安全
(transaction-safe (ACID compliant))型表。InnoDB 提供了行锁
(locking on row level),提供与 Oracle 类型一致的不加锁读取(non-locking
read in SELECTs)。这些特性均提高了多用户并发操作的性能表现。
在InnoDB表中不需要扩大锁定(lock escalation),因为 InnoDB 的列锁定(row level
locks)适宜非常小的空间。InnoDB 是 MySQL 上第一个提供外键约束(FOREIGN KEY
constraints)的表引擎。

InnoDB 的设计目标是处理大容量数据库系统,它的 CPU 利用率是其它基于磁盘的关系数据库
引擎所不能比的。在技术上,InnoDB 是一套放在 MySQL 后台的完整数据库系统,
InnoDB 在主内存中建立其专用的缓冲池用于高败陪隐速缓冲数察厅据和索引。 InnoDB 把数据和索引存
放在表空间里,可能包含多个文件,这与其它的不一样,举例来说,在 MyISAM 中,表被存放
在单独的文件中。InnoDB 表的大小只受限于操作系统的文件大小,一般为 2 GB。
InnoDB所有的表都保存在同一个数据文件 ibdata1 中(也可能是多个文件,或者是独立的
表空间文件),相对来说比较不好备份,免费的方案可以是拷贝数据文件、备份 binlog,
或者用 mysqlmp。

MyISAM
MyISAM 是MySQL缺省存贮引擎 .

每张MyISAM 表被存放在三个文件 。frm 文件存放表格定义。 数据文件是MYD (MYData) 。
索引文件是MYI (MYIndex) 引伸。

因为MyISAM相对简单所以在效率上要优于InnoDB..小型应用使用MyISAM是不错的选择.

MyISAM表是保存成文件的形式,在跨平台的数据转移中使用MyISAM存储会省去不少的麻烦

MyISAM是ISAM表的新版本,有如下扩展:

·二进制层次的可移植性。
·NULL列索引。
·对变长行比ISAM表有更少的碎片。
·支持大文件。
·更好的索引压缩。
·更好的键吗统计分布。
·更好和更快的auto_increment处理。

以下是一些细节和具体实现的差别:

◆1.InnoDB不支持FULLTEXT类型的索引。
◆2.InnoDB 中不保存表的具体行数,也就是说,执行select count(*) from table时,
InnoDB要扫描一遍整个表来计算有多少行,但是MyISAM只要简单的读出保存好的行数即可。
注意的是,当count(*)语句包含 where条件时,两种表的操作是一样的。
◆3.对于AUTO_INCREMENT类型的字段,InnoDB中必须包含只有该字段的索引,但是在MyISAM
表中,可以和其他字段一起建立联合索引。
◆4.DELETE FROM table时,InnoDB不会重新建立表,而是一行一行的删除。
◆5.LOAD TABLE FROM MASTER操作对InnoDB是不起作用的,解决方法是首先把InnoDB表改成
MyISAM表,导入数据后再改成InnoDB表,但是对于使用的额外的InnoDB特性(例如外键)的
表不适用。

◆MyISAM类型的二进制数据文件可以在不同操作系统中迁移。

另外,InnoDB表的行锁也不是绝对的,假如在执行一个SQL语句时MySQL不能确定要扫描的
范围,InnoDB表同样会锁全表,例如update table set num=1 where name like “%aaa%”

再另外,使用两种的选择:如果你的数据执行大量的INSERT或UPDATE,出于性能方面的考虑,
应该使用InnoDB表。如果执行大量的SELECT,MyISAM是更好的选择。若需要使用事务处理,
但是原来的数据表使用的是myisam,就需要改为bdb或者innodb,这样基于myisam的程序,
将类型改为innodb后,其程序不用改动……

综上所述,任何一种表都不是万能的,只有恰当的针对业务类型来选择合适的表类型,才能
最大的发挥MySQL的性能优势。

MyISAM和InnoDB优化:
key_buffer_size - 这对MyISAM表来说非常重要。如果只是使用MyISAM表,可以把它设置
为可用内存的 30-40%。合理的值取决于索引大小、数据量以及负载 -- 记住,MyISAM表会
使用操作系统的缓存来缓存数据,因此需要留出部分内存给它们,很多情况下数据比索引大
多了。尽管如此,需要总是检查是否所有的 key_buffer 都被利用了 -- .MYI 文件只有 1GB
,而 key_buffer 却设置为 4GB 的情况是非常少的。这么做太浪费了。如果你很少使用
MyISAM表,那么也保留低于 16-32MB 的 key_buffer_size 以适应给予磁盘的临时表索引
所需。
innodb_buffer_pool_size - 这对Innodb表来说非常重要。Innodb相比MyISAM表对缓冲更
为敏感。MyISAM可以在默认的 key_buffer_size 设置下运行的可以,然而Innodb在默认的
innodb_buffer_pool_size 设置下却跟蜗牛似的。由于Innodb把数据和索引都缓存起来,
无需留给操作系统太多的内存,因此如果只需要用Innodb的话则可以设置它高达 70-80% 的
可用内存。一些应用于 key_buffer 的规则有 -- 如果你的数据量不大,并且不会暴增,那
么无需把
innodb_additional_pool_size - 这个选项对性能影响并不太多,至少在有差不多足够内存
可分配的操作系统上是这样。不过如果你仍然想设置为 20MB(或者更大),因此就需要看一下
Innodb其他需要分配的内存有多少。
innodb_log_file_size 在高写入负载尤其是大数据集的情况下很重要。这个值越大则性能相
对越高,但是要注意到可能会增加恢复时间。我经常设置为 64-512MB,跟据服务器大小而异。
innodb_log_buffer_size 默认的设置在中等强度写入负载以及较短事务的情况下,服务器性
能还可以。如果存在更新操作峰值或者负载较大,就应该考虑加大它的值了。如果它的值设置
太高了,可能会浪费内存 -- 它每秒都会刷新一次,因此无需设置超过1秒所需的内存空间。
通常 8-16MB 就足够了。越小的系统它的值越小。
innodb_flush_logs_at_trx_commit 是否为Innodb比MyISAM慢1000倍而头大?看来也许你忘
了修改这个参数了。默认值是 1,这意味着每次提交的更新事务(或者每个事务之外的语句)
都会刷新到磁盘中,而这相当耗费资源,尤其是没有电池备用缓存时。很多应用程序,尤其是
从 MyISAM转变过来的那些,把它的值设置为 2 就可以了,也就是不把日志刷新到磁盘上,
而只刷新到操作系统的缓存上。日志仍然会每秒刷新到磁盘中去,因此通常不会丢失每秒1-
2次更新的消耗。如果设置为 0 就快很多了,不过也相对不安全了 -- MySQL服务器崩溃时
就会丢失一些事务。设置为 2 指挥丢失刷新到操作系统缓存的那部分事务。
table_cache -- 打开一个表的开销可能很大。例如MyISAM把MYI文件头标志该表正在使用
中。你肯定不希望这种操作太频繁,所以通常要加大缓存数量,使得足以最大限度地缓存打
开的表。它需要用到操作系统的资源以及内存,对当前的硬件配置来说当然不是什么问题了。
如果你有200多个表的话,那么设置为 1024 也许比较合适(每个线程都需要打开表),
如果连接数比较大那么就加大它的值。我曾经见过设置为 100,000 的情况。
thread_cache -- 线程的创建和销毁的开销可能很大,因为每个线程的连接/断开都需要。
我通常至少设置为 16。如果应用程序中有大量的跳跃并发连接并且 Threads_Created 的值
也比较大,那么我就会加大它的值。它的目的是在通常的操作中无需创建新线程。
query_cache -- 如果你的应用程序有大量读,而且没有应用程序级别的缓存,那么这很有
用。不要把它设置太大了,因为想要维护它也需要不少开销,这会导致MySQL变慢。通常设置
为 32-512Mb。设置完之后最好是跟踪一段时间,查看是否运行良好。在一定的负载压力下,
如果缓存命中率太低了,就启用它。
sort_buffer_size --如果你只有一些简单的查询,那么就无需增加它的值了,尽管你有
64GB 的内存。搞不好也许会降低性能

‘拾’ innodb和myisam的区别

innodb和myisam的区别为:事务不同、外键不同、索引不同。

一、事务不同

1、innodb:innodb不支持事务,无法回滚操作,还原数据。

2、myisam:myisam支持事务,可以回滚操作,还原数据。

二、外键不同

1、innodb:innodb支持外键。

2、myisam:myisam不支持外键。租渗局

三、索引不同

1、innodb:对于自增长的字段,InnoDB中必须包含只有该字段的索引。

2、myisam:对于自增弊让长的字段,MyISAM表中可以和其他字喊碰段一起建立联合索引。

热点内容
云访问安全 发布:2025-05-17 18:36:31 浏览:624
算法设计与分析课件 发布:2025-05-17 18:21:11 浏览:766
安卓禁止软件安装怎么解除 发布:2025-05-17 18:16:52 浏览:219
绝地求生极客电脑怎么配置 发布:2025-05-17 18:16:50 浏览:51
显卡编程语言 发布:2025-05-17 18:11:46 浏览:919
编程用什么轴机械键盘 发布:2025-05-17 18:10:35 浏览:960
金融工程编程 发布:2025-05-17 18:10:33 浏览:224
私密模式访问 发布:2025-05-17 18:09:44 浏览:788
数据库崩溃原因 发布:2025-05-17 18:09:42 浏览:307
对虾养殖增氧机如何配置 发布:2025-05-17 18:08:20 浏览:443