mysql> show variables like '%slow%';+------------------+-------+| Variable_name| Value |+------------------+-------+| log_slow_queries | ON|| slow_launch_time | 2|+------------------+-------+mysql> show global status like '%slow%';+---------------------+-------+| Variable_name| Value |+---------------------+-------+| Slow_launch_threads | 0|| Slow_queries| 4148 |+---------------------+-------+ |
配置中打开了记录慢查询,执行时间超过2秒的即为慢查询,系统显示有4148个慢查询,你可以分析慢查询日志,找出有问题的SQL语句,慢查询时间不宜设置过长,否则意义不大,***在5秒以内,如果你需要微秒级别的慢查询,可以考虑给MySQL打补丁:,记得找对应的版本。
打开慢查询日志可能会对系统性能有一点点影响,如果你的MySQL是主-从结构,可以考虑打开其中一台从服务器的慢查询日志,这样既可以监控慢查询,对系统性能影响又小。
二、连接数
经常会遇见”MySQL: ERROR 1040: Too many connections”的情况,一种是访问量确实很高,MySQL服务器抗不住,这个时候就要考虑增加从服务器分散读压力,另外一种情况是MySQL配置文件中max_connections值过小:
mysql> show variables like 'max_connections';+-----------------+-------+| Variable_name| Value |+-----------------+-------+| max_connections | 256|+-----------------+-------+ |
这台MySQL服务器***连接数是256,然后查询一下服务器响应的***连接数:
mysql> show global status like 'Max_used_connections'; |
MySQL服务器过去的***连接数是245,没有达到服务器连接数上限256,应该没有出现1040错误,比较理想的设置是:
Max_used_connections / max_connections * 100% ≈ 85% |
***连接数占上限连接数的85%左右,如果发现比例在10%以下,MySQL服务器连接数上限设置的过高了。
三、Key_buffer_size
key_buffer_size是对MyISAM表性能影响***的一个参数,下面一台以MyISAM为主要存储引擎服务器的配置:
mysql> show variables like 'key_buffer_size'; +-----------------+------------+| Variable_name| Value|+-----------------+------------+| key_buffer_size | 536870912 |+-----------------+------------+ |
分配了512MB内存给key_buffer_size,我们再看一下key_buffer_size的使用情况:
mysql> show global status like 'key_read%';+------------------------+-------------+| Variable_name| Value|+------------------------+-------------+| Key_read_requests| 27813678764 || Key_reads| 6798830|+------------------------+-------------+ |
一共有27813678764个索引读取请求,有6798830个请求在内存中没有找到直接从硬盘读取索引,计算索引未命中缓存的概率:
key_cache_miss_rate = Key_reads / Key_read_requests * 100% |
比如上面的数据,key_cache_miss_rate为0.0244%,4000个索引读取请求才有一个直接读硬盘,已经很BT了,key_cache_miss_rate在0.1%以下都很好(每1000个请求有一个直接读硬盘),如果key_cache_miss_rate在0.01%以下的话,key_buffer_size分配的过多,可以适当减少。
MySQL服务器还提供了key_blocks_*参数:
mysql> 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%
四、临时表
mysql> show global status like 'created_tmp%';+-------------------------+---------+| Variable_name| Value|+-------------------------+---------+| Created_tmp_disk_tables | 21197|| Created_tmp_files| 58|| Created_tmp_tables| 1771587 |+-------------------------+---------+ |
每次创建临时表,Created_tmp_tables增加,如果是在磁盘上创建临时表,Created_tmp_disk_tables也增加,Created_tmp_files表示MySQL服务创建的临时文件文件数,比较理想的配置是:
Created_tmp_disk_tables / Created_tmp_tables * 100% <= 25%
比如上面的服务器Created_tmp_disk_tables / Created_tmp_tables * 100% = 1.20%,应该相当好了。我们再看一下MySQL服务器对临时表的配置:
mysql> show variables where Variable_name in ('tmp_table_size', 'max_heap_table_size');+---------------------+-----------+| Variable_name| Value|+---------------------+-----------+| max_heap_table_size | 268435456 || tmp_table_size| 536870912 |+---------------------+-----------+ |
只有256MB以下的临时表才能全部放内存,超过的就会用到硬盘临时表。
五、Open Table情况
mysql> show global status like 'open%tables%';+---------------+-------+| Variable_name | Value |+---------------+-------+| Open_tables| 919|| Opened_tables | 1951|+---------------+-------+ |
Open_tables表示打开表的数量,Opened_tables表示打开过的表数量,如果Opened_tables数量过大,说明配置中table_cache(5.1.3之后这个值叫做table_open_cache)值可能太小,我们查询一下服务器table_cache值:
mysql> show variables like 'table_cache';+---------------+-------+| Variable_name | Value |+---------------+-------+| table_cache| 2048|+---------------+-------+ |
比较合适的值为:
Open_tables / Opened_tables * 100% >= 85%
Open_tables / table_cache * 100% <= 95%
六、进程使用情况
mysql> show global status like 'Thread%';+-------------------+-------+| Variable_name| Value |+-------------------+-------+| Threads_cached| 46|| Threads_connected | 2|| Threads_created| 570|| Threads_running| 1|+-------------------+-------+ |
如果我们在MySQL服务器配置文件中设置了thread_cache_size,当客户端断开之后,服务器处理此客户的线程将会缓存起来以响应下一个客户而不是销毁(前提是缓存数未达上限)。Threads_created表示创建过的线程数,如果发现Threads_created值过大的话,表明MySQL服务器一直在创建线程,这也是比较耗资源,可以适当增加配置文件中thread_cache_size值,查询服务器thread_cache_size配置:
mysql> show variables like 'thread_cache_size';+-------------------+-------+| Variable_name| Value |+-------------------+-------+| thread_cache_size | 64|+-------------------+-------+ |
示例中的服务器还是挺健康的。

七、查询缓存(Query cache)
mysql> show global status like 'qcache%';+-------------------------+-----------+| Variable_name| Value|+-------------------------+-----------+| Qcache_free_blocks| 22756|| Qcache_free_memory| 76764704|| Qcache_hits| 213028692 || Qcache_inserts| 208894227 || Qcache_lowmem_prunes| 4010916|| Qcache_not_cached| 13385031|| Qcache_queries_in_cache | 43560|| Qcache_total_blocks| 111212|+-------------------------+-----------+ |
MySQL查询缓存变量解释:
Qcache_free_blocks:缓存中相邻内存块的个数。数目大说明可能有碎片。FLUSH QUERY CACHE会对缓存中的碎片进行整理,从而得到一个空闲块。
Qcache_free_memory:缓存中的空闲内存。
Qcache_hits:每次查询在缓存中命中时就增大
Qcache_inserts:每次插入一个查询时就增大。命中次数除以插入次数就是不中比率。
Qcache_lowmem_prunes:缓存出现内存不足并且必须要进行清理以便为更多查询提供空间的次数。这个数字***长时间来看;如果这个数字在不断增长,就表示可能碎片非常严重,或者内存很少。(上面的 free_blocks和free_memory可以告诉您属于哪种情况)
Qcache_not_cached:不适合进行缓存的查询的数量,通常是由于这些查询不是 语句或者用了now()之类的函数。
Qcache_queries_in_cache:当前缓存的查询(和响应)的数量。
Qcache_total_blocks:缓存中块的数量。
我们再查询一下服务器关于query_cache的配置:
mysql> show variables like 'query_cache%';+------------------------------+-----------+| Variable_name| Value|+------------------------------+-----------+| query_cache_liMIT| 2097152|| query_cache_min_res_unit| 4096|| query_cache_size| 203423744 || query_cache_type| ON|| query_cache_wlock_invalidate | OFF|+------------------------------+-----------+ |
各字段的解释:
query_cache_limit:超过此大小的查询将不缓存
query_cache_min_res_unit:缓存块的最小大小
query_cache_size:查询缓存大小
query_cache_type:缓存类型,决定缓存什么样的查询,示例中表示不缓存 select sql_no_cache 查询
query_cache_wlock_invalidate:当有其他客户端正在对MyISAM表进行写操作时,如果查询在query cache中,是否返回cache结果还是等写操作完成再读表获取结果。
query_cache_min_res_unit的配置是一柄”双刃剑”,默认是4KB,设置值大对大数据查询有好处,但如果你的查询都是小数据查询,就容易造成内存碎片和浪费。
查询缓存碎片率 = Qcache_free_blocks / Qcache_total_blocks * 100%
如果查询缓存碎片率超过20%,可以用FLUSH QUERY CACHE整理缓存碎片,或者试试减小query_cache_min_res_unit,如果你的查询都是小数据量的话。
查询缓存利用率 = (query_cache_size - Qcache_free_memory) / query_cache_size * 100%
查询缓存利用率在25%以下的话说明query_cache_size设置的过大,可适当减小;查询缓存利用率在80%以上而且Qcache_lowmem_prunes > 50的话说明query_cache_size可能有点小,要不就是碎片太多。
查询缓存命中率 = (Qcache_hits - Qcache_inserts) / Qcache_hits * 100%
示例服务器 查询缓存碎片率 = 20.46%,查询缓存利用率 = 62.26%,查询缓存命中率 = 1.94%,命中率很差,可能写操作比较频繁吧,而且可能有些碎片。
八、排序使用情况
mysql> show global status like 'sort%';+-------------------+------------+| Variable_name| Value|+-------------------+------------+| Sort_merge_passes | 29|| Sort_range| 37432840|| Sort_rows| 9178691532 || Sort_scan| 1860569|+-------------------+------------+ |
Sort_merge_passes 包括两步。MySQL 首先会尝试在内存中做排序,使用的内存大小由系统变量 Sort_buffer_size 决定,如果它的大小不够把所有的记录都读到内存中,MySQL 就会把每次在内存中排序的结果存到临时文件中,等 MySQL 找到所有记录之后,再把临时文件中的记录做一次排序。这再次排序就会增加 Sort_merge_passes。实际上,MySQL 会用另一个临时文件来存再次排序的结果,所以通常会看到 Sort_merge_passes 增加的数值是建临时文件数的两倍。因为用到了临时文件,所以速度可能会比较慢,增加 Sort_buffer_size 会减少 Sort_merge_passes 和 创建临时文件的次数。但盲目的增加 Sort_buffer_size 并不一定能提高速度,见 How fast can you sort cellpadding="2" border="1"> 比较合适的设置:Open_files / open_files_limit * 100% <= 75% 十、表锁情况 Table_locks_immediate表示立即释放表锁数,Table_locks_waited表示需要等待的表锁数,如果Table_locks_immediate / Table_locks_waited > 5000,***采用InnoDB引擎,因为InnoDB是行锁而MyISAM是表锁,对于高并发写入的应用InnoDB效果会好些。示例中的服务器Table_locks_immediate / Table_locks_waited = 235,MyISAM就足够了。 十一、表扫描情况 各字段解释参见,调出服务器完成的查询请求次数: 计算表扫描率: 表扫描率 = Handler_read_rnd_next / Com_select 如果表扫描率超过4000,说明进行了太多表扫描,很有可能索引没有建好,增加read_buffer_size值会有一些好处,但***不要超过8MB。 后记: 文中提到一些数字都是参考值,了解基本原理就可以,除了MySQL提供的各种status值外,操作系统的一些性能指标也很重要,比如常用的top,iostat等,尤其是iostat,现在的系统瓶颈一般都在磁盘IO上,关于iostat的使用,可以参考:【编辑推荐】mysql> show global status like 'open_files';+---------------+-------+| Variable_name | Value |+---------------+-------+| Open_files| 1410|+---------------+-------+mysql> show variables like 'open_files_limit';+------------------+-------+| Variable_name| Value |+------------------+-------+| open_files_limit | 4590|+------------------+-------+
mysql> show global status like 'table_locks%';+-----------------------+-----------+| Variable_name| Value|+-----------------------+-----------+| Table_locks_immediate | 490206328 || Table_locks_waited| 2084912|+-----------------------+-----------+
mysql> show global status like 'handler_read%';+-----------------------+-------------+| Variable_name| Value|+-----------------------+-------------+| Handler_read_first| 5803750|| Handler_read_key| 6049319850|| Handler_read_next| 94440908210 || Handler_read_prev| 34822001724 || Handler_read_rnd| 405482605|| Handler_read_rnd_next | 18912877839 |+-----------------------+-------------+
mysql> show global status like 'com_select';+---------------+-----------+| Variable_name | Value|+---------------+-----------+| Com_select| 222693559 |+---------------+-----------+
数据库优化包括哪些相关操作?
此文章主要向大家介绍的是MySQL数据库优化,其中还包括MySQL数据库的性能优化, 常用的SQL语句的优化以及MySQL数据库对INSERT语句进行优化的实际操作方案的描述,望你会有所收获。 MySQL InnoDB 的性能问题讨论 MySQL性能优化 InnoDB delete from xxx速度暴慢原因 推荐圈子: mysql研究 更多相关推荐 1、定期分析表和检查表 分析表的语法如下: 引用 [LOCAL | NO_WRITE_TO_BINLOG] TABLE tb1_name[, tbl_name]... 以上语句用于分析和存储表的关键字分布,分析的结果将可以使得系统得到准确的统计信息,使得SQL能够生成正确的执行计划。 如果用户感觉实际执行计划并不是预期的执行计划,执行一次分析表可能会解决问题。 在分析期间,使用一个读取锁定对表进行锁定。 这对于MyISAM,DBD和InnoDB表有作用。 例如分析一个数据表 引用 table table_name 检查表的语法如下: 引用 TABLE tb1_name[,tbl_name]...[option] = {QUICK | FAST | MEDIUM | EXTENDED | CHANGED} 检查表的作用是检查一个或多个表是否有错误,CHECK TABLE 对MyISAM 和 InnoDB表有作用,对于MyISAM表,关键字统计数据被更新 CHECK TABLE 也可以检查视图是否有错误,比如在视图定义中被引用的表不存在。 2. 定期优化表 MySQL数据库优化表的语法如下: 引用 [LOCAL | NO_WRITE_TO_BINLOG] TABLE tb1_name [,tbl_name]... 如果删除了表的一大部分,或者如果已经对含有可变长度行的表(含有 VARCHAR、BLOB或TEXT列的表)进行更多更改,则应使用OPTIMIZE TABLE命令来进行表优化。 这个命令可以将表中的空间碎片进行合并,并且可以消除由于删除或者更新造成的空间浪费,但OPTIMIZE TABLE 命令只对MyISAM、 BDB 和InnoDB表起作用。 例如: optimize table table_name 注意: analyze、check、optimize执行期间将对表进行锁定,因此一定注意要在数据库不繁忙的时候执行相关的操作。 常用的SQL优化 我们在开发的时候常常用到的SQL语句,无非是INSERT、GROUPBY等等。 对于这些SQL语句,我们怎么进行优化? 1. 大批量插入数据 当用load命令导入数据的时候,适当的设置可以提高导入的速度。 对于MyISAM存储引擎的表,可以通过如下方式快速的导入大量的数据 引用 TABLE tb1_name DISABLE KEYS; the data TABLE tb1_name ENABLE KEYS; DISABLE KEYS 和 ENABLE KEYS 用来打开或者关闭MyISAM表非唯一索引的更新。 在导入大量的数据到一个非空的MyISAM表时,通过设置这两个命令,可以提高导入的效率。 对于导入大量的数据到一个空的MyISAM表时,默认就是先导入数据然后才创建索引的,索引不用进行设置。 引用 data infile /home/mysql/text_txt into table text 对于InnoDB类型的表,这种方式不能提高导入数据的效率,但也有几种针对InnoDB类型的表进行MySQL数据库优化的方式。 1. 因为InnoDB类型的表式按照主键的顺序保存的,所以将导入的数据按照主键的顺序排序,可以有效提高导入数据的效率。 2. 在导入数据前执行 SET UNIQUE_CHECKS=0,关闭唯一性校验,在导入结束后执行SET UNIQUE_CHECKS=1,恢复唯一性校验,可以提高导入的效率。 3. 如果应用使用自动提交的方式,建议在导入前执行SET AUTOCOMMIT=0,关闭自动提交,导入结束后执行SET AUTOCOMMIT=1,打开自动提交,也可以提高导入效率。 MySQL数据库优化INSERT语句 当进行数据INSERT的时候,可以考虑采用以下几种方式进行优化 1. 如果同时从一个客户插入很多行,尽量使用多个值表的INSERT语句,这种方式将大大缩短客户端与数据库的链接、关闭等消耗,使得效率比分开执行的单个INSERT语句快. 例如: into test values(1,2) into test values(3,4) into test values(5,6) 将上面三句改为:insert into test values(1,2),(3,4),(5,6)...... 2. 如果从不同客户插入很多行,能通过使用INSERT DELAYED 语句得到更高的速度。 DELAYED 的含义是让INSERT 语句马上执行,其实数据都被放在内存的队列中,并没有真正写入磁盘,这比每条语句分别插入要快得多;LOW_PRIORITY刚好相反,在所有其他用户对表的读写完后才进行插入。 3. 将索引文件和数据文件分在不同的磁盘上存放 4. 如果进行批量插入,可以增加bulk_insert_buffer_size变量值的方法来提高速度,但是,这只能对于MyISAM表使用。 5. 当从一个文本文件中装载一个表时,使用LOAD DATA INFILE。 这通常比使用很多insert语句快20倍左右。 以上的相关内容就是对MySQL数据库优化方法的介绍,望你能有所收获。
美国留学签证I-20表格如何填写?
1、I-20看起来是什么样的?答:看起来相当普通的3张白纸,上面打印着申请人的各种信息2、一个可不可以接受多个学校的录取,从而持有多个I-20?如果不可以,那么有多余的怎么办?答:不可以。 也许会有很多学校给你寄I-20,但是你只能接受一个,也就是说,你只有一个合法的I-20。 如果手里的I-20不只一个,那么在签证前,一定要把多余的寄回去。 3、I-20的信息有误应该怎么办?答:拿到I-20,马上要核对信息的准确性。 如果出现错误,就马上联系学校,让他们再给你寄一份。 4、我应该在I-20上填写什么?答:检查无误后,在第一页的最后一项,也就是第11项,签上自己的名字,其余的一律不动。 5、第一项里,有一个空格是admission number,但是这一栏是空着的,这是什么意思?答:Admission Number是你拿着I-20第一次入境的时候美国移民局官员给你的一个Number,由他们填在I-20的那个空格里。 一般是你第一次入境时拿到的I-94上的编号。 以后每次入境的时候虽然会有新的I-94,但是这个Admission Number不会再变了。 这就是为什么诸位拿到的I-20这一栏是空着的原因。 因为你们根本就没有这个Number嘛。 对于那些在美国换了I-20的XDJM们来说,因为他们已经入过境了,所以有这个Number。 换I-20的时候这个Number会由学校的International Center填写在新的I-20上。 6、半奖的、全自费的,是不是一定要先给学校寄出财力证明,才会收到学校的I-20表格?答:一般学校的要求都是这样的。 而且寄过去的证明可能不会退还回来。 签证还要使用证明,所以你可以找银行开两份证明(这两份证明代表的是同一份资金)学,签证,申请,美国,英国,加拿大,欧洲7、预约签证的时候需要I-20表吗?答:预约的时候不需要I-20表。 预约的时候,需要提供的是护照号码、你的名字、出生日期、拒签过没有、联系方式等。 8、F-1签证被拒,换了一个学校,学校的I-20表要不要给寄回去?答:不用。 从前的I-20过期了,不用寄回去9、Spouse 的I-20,学校寄了两个人的I-20(两份),签名时F1签还是F2签啊?答:F1签两份表格GRE,TO10、Sevis系统里都有哪些信息答:3A students enrollment status at the university;The semester starting date;A students failure to enroll;A student dropping below full-time without permission;Any other violation of status;A change in the students name or address;Any disciplinary action taken by a school against a student;Optional Practical Training (OPT)Curricular Practical Training (CPT)Academic TrainingChange of Education Level ExtensionA students graduation date原文来源:
ARM的IP核有几种结构版本?
各ARM体系结构版本ARM体系结构从最初开发到现在有了很大的改进,并仍在完善和发展。 为了清楚地表达每个ARM应用实例所使用的指令集,ARM公司定义了6种主要的ARM指令集体系结构版本,以版本号V1~V6表示ARM版本Ⅰ: V1版架构该版架构只在原型机ARM1出现过,只有26位的寻址空间,没有用于商业产品。 其基本性能有:基本的数据处理指令(无乘法);基于字节、半字和字的Load/Store指令;转移指令,包括子程序调用及链接指令;供操作系统使用的软件中断指令SWI;寻址空间:64MB(226)。 ARM版本Ⅱ: V2版架构该版架构对V1版进行了扩展,例如ARM2和ARM3(V2a)架构。 包含了对32位乘法指令和协处理器指令的支持。 版本2a是版本2的变种,ARM3芯片采用了版本2a,是第一片采用片上Cache的ARM处理器。 同样为26位寻址空间,现在已经废弃不再使用。 V2版架构与版本V1相比,增加了以下功能:乘法和乘加指令;支持协处理器操作指令;快速中断模式;SWP/SWPB的最基本存储器与寄存器交换指令;寻址空间:64MB。 ARM版本Ⅲ : V3版架构ARM作为独立的公司,在1990年设计的第一个微处理器采用的是版本3的ARM6。 它作为IP核、独立的处理器、具有片上高速缓存、MMU和写缓冲的集成CPU。 变种版本有3G和3M。 版本3G是不与版本2a向前兼容的版本3,版本3M引入了有符号和无符号数乘法和乘加指令,这些指令产生全部64位结果。 V3版架构( 目前已废弃 )对ARM体系结构作了较大的改动:寻址空间增至32位(4GB);当前程序状态信息从原来的R15寄存器移到当前程序状态寄存器CPSR中(Current Program Status Register);增加了程序状态保存寄存器SPSR(Saved Program Status Register);增加了两种异常模式,使操作系统代码可方便地使用数据访问中止异常、指令预取中止异常和未定义指令异常。 ;增加了MRS/MSR指令,以访问新增的CPSR/SPSR寄存器;增加了从异常处理返回的指令功能。 ARM版本Ⅳ : V4版架构V4版架构在V3版上作了进一步扩充,V4版架构是目前应用最广的ARM体系结构,ARM7、ARM8、ARM9和StrongARM都采用该架构。 V4不再强制要求与26位地址空间兼容,而且还明确了哪些指令会引起未定义指令异常。 指令集中增加了以下功能:符号化和非符号化半字及符号化字节的存/取指令;增加了T变种,处理器可工作在Thumb状态,增加了16位Thumb指令集;完善了软件中断SWI指令的功能;处理器系统模式引进特权方式时使用用户寄存器操作;把一些未使用的指令空间捕获为未定义指令ARM版本Ⅴ : V5版架构V5版架构是在V4版基础上增加了一些新的指令,ARM10和Xscale都采用该版架构。 这些新增命令有:带有链接和交换的转移BLX指令;计数前导零CLZ指令;BRK中断指令;增加了数字信号处理指令(V5TE版); 为协处理器增加更多可选择的指令;改进了ARM/Thumb状态之间的切换效率;E---增强型DSP指令集,包括全部算法操作和16位乘法操作;J----支持新的JAVA,提供字节代码执行的硬件和优化软件加速功能。 ARM版本Ⅵ : V6版架构V6版架构是2001年发布的,首先在2002年春季发布的ARM11处理器中使用。 在降低耗电量地同时,还强化了图形处理性能。 通过追加有效进行多媒体处理的SIMD(Single Instruction, Multiple Data,单指令多数据 )功能,将语音及图像的处理功能提高到了原型机的4倍。 此架构在V5版基础上增加了以下功能:THUMBTM:35%代码压缩;DSP扩充:高性能定点DSP功能;JazelleTM:Java性能优化,可提高8倍;Media扩充:音/视频性能优化,可提高4倍
发表评论