在MYSQL的优化过程中,我们至少有三种办法,可以达到优化的目的,效率从低到高依次是
- 替换有问题的硬件。
- 对MYSQL进程的设置进行调优。
- 对查询进行优化。
- 数据在内存中访问,比磁盘上访问的速度要快得多。
- 如果可以,在内存中尽可能长地保存数据存活时间,以减少磁盘活动量。
- 在保存内存数据时,索引的信息比保留数据行的内容更加重要些。
一,table_open_cache调节
SHOW STATUS LIKE ‘Open%tables’
这个命令会显示两个状态变量:Open_tables 和Opened_tables,分别表示当前打开的表的数量 和已经打开的表的数量。
在执行flush tables; 命令后会清空缓存的内容,也就是的当前打开的表缓存清空,不影响已经打开表数量的状态显示。在你清空之后,如果再执行表查询或者相关的表操作,这时会发现这两个状态值都被加上相应的值(些次操作打开表的数量);
一般情况下,如果Open_tables的值和table_cache的值很接近,并且Opened_tables增长很快,这时说明我们可能需要把缓存设置更大。但也不能设置过大,因为使用缓存要占用系统的文件描述符数量,就相当于打开一个文件,这可能会导致系统其它的必要打开文件需求无法得到满足,从而导致系统不稳定。
对这个值的设置,应该要综合各个因素,包括:系统的连接数以及表的数目,Open_tables 和Opened_tables的值的比例(最好保持比例在80%以上),然后是Open_tables和table_cache的比较等等。
最后,要说明的是,由于InnoDB存储引擎的数据放于表共享空间,经过测试,这个参数对该存储引擎表的性能影响不是很大。
二,key_buffer_size
- 创建一个新的键缓存区域,使他可以容纳所有的表索引(我这个表比较小)
mysql> set global name_cache.key_buffer_size = 1024; - 把数据表指定给这个键缓存
mysql> cache index i_node in name_cache;
+----------------+--------------------+----------+----------+
| Table | Op | Msg_type | Msg_text |
+----------------+--------------------+----------+----------+
| db_info.i_node | assign_to_keycache | status | OK |
+----------------+--------------------+----------+----------+ - 把数据表的索引全部加载至键缓存中
mysql> load index into cache i_node;
+----------------+--------------+----------+----------+
| Table | Op | Msg_type | Msg_text |
+----------------+--------------+----------+----------+
| db_info.i_node | preload_keys | status | OK |
+----------------+--------------+----------+----------+
- 创建一个新的键缓存区域,使他可以容纳所有的表索引(我这个表比较小)
三,查询缓存
- 一个给定的SELECT语句第一次执行时,服务器记录了它查询的文本和返回的结果。
- 服务器下一次看到这个查询时就不再执行它,而是直接从查询缓存中将查询结果取出并返回。
- 查询缓存以服务器接受的那些查询字符串的文本为基础。
- 如果某个查询命令返回的结果不确定,这个查询就不会被缓存。比如,查询结果包含当前的时间。
- 如果一个数据表被更新时,所有与之相关的缓存着的查询会全部失效,并删除所有之前缓存的关于这个表的缓存。
- query_cache_type . 决定查询缓存的操作模式。 0:不缓存查询结果/不检索已经被缓存的结果。1:缓存查询,但不包括以SELECT SQL_NO_CACHE开头的查询。2:只缓存以SELECT SQL_CACHE开头的查询。
- query_cache_size 决定了为查询缓存分配的内存大小 ,以字节为单位。
- query_cache_limit 设置能够缓存的最大结果集的大小,比这个值大的查询结果不能被缓存。
mysql> show global status like "qcache%";+-------------------------+-------+| Variable_name | Value |+-------------------------+-------+| Qcache_free_blocks | 0 || Qcache_free_memory | 0 || Qcache_hits | 0 || Qcache_inserts | 0 || Qcache_lowmem_prunes | 0 || Qcache_not_cached | 0 || Qcache_queries_in_cache | 0 || Qcache_total_blocks | 0 |+-------------------------+-------+对各个值的表示意思是:Qcache_free_blocks : 缓存中空闲内存块的数目。Qcache_free_memory : 缓存中空闲内存的总数。Qcache_hits 查询缓存命中的次数。Qcache_inserts : 加入到缓存中的数目。Qcache_lowmem_prunes : 因为缺少内存,而被从缓存中删除的数目。Qcache_not_cached:没有被缓存的查询数目,由于一些设置或者非SELECT查询。Qcache_queries_in_cache :当前缓存中的条目。Qcache_total_blocks:查询缓存中块的总数目。根据这个结果我们可以统计总的查询次数 =Qcache_inserts +Qcache_hits +Qcache_not_cached;查询缓存使用变长的块,因而 Qcache_total_blocks 和 Qcache_free_blocks 可能显示查询缓存的碎片。在FLUSH QUERY CACHE之后,只有剩余一个单独的(大的)空闲块。