Unique Skill
1 What is transient variable? Transient variable can’t be serialize. For example if a variable is declared as transient in a Serializable class and the class is written to an ObjectStream, the value of the variable can’t be written to the stream instead when the class is retrieved from the ObjectStream the value of the […]
MySQL Storage Engine 小记
这段时间在看《High Performance MySQL》,看到存储引擎这个地方感到很多细节比较陌生,所以总结小记一些为了适应各种不同的运行环境,MYSQL提供了多种不同的存储引擎(Storage Engine ),在应用程序开发这个层面上,开发者可以根据不同的需求选择适合的Storage Engine 方案,更为灵活的是,你可以根据每张表将要存储数据的特点,选择不同的Storage Engine,也就是说,在一个MYSQL数据库中,可以混合使用多种不同的Storage Engine首先小瞥一下MySQL的体系结构,在最高抽象层度下,可以用Garlan & Shaw的分层结构体系来表示(左) 其中应用层为所有RDBMS用户提供用户接口,逻辑层包括了所有核心功能的实现,物理层则负责将数据存储在硬件设备上。图中右侧更为具体的描述了逻辑层的组成,查询处理子系统、事务管理子系统、恢复管理子系统和存储管理子系统共同组成了MySQL的逻辑层。相信Storage Engine的位置是在Storage Management处,既Storage Engine属于Storage Management子系统的一部分为了让思路更清晰一些,下面给出一幅比较全面的体系结构图(或更确切的说是流程图,只是忽略了反馈) 上面三幅图来自于一篇非官方(不保证百分百的正确)的MySQL体系结构的报告,与《High Performance MySQL》一书中给出的MySQL大体结构(下图,基本对应于Logic Layer,从第一幅图右侧可以看出MySQL logic layer同样遵从分层体系结构)还是比较吻合的。 连接上图中第二层和第三层之间的接口是并不针对任何存储引擎的单一API,.大概由20个基本的类似“启动事务,返回结果集”等函数组成。存储引擎并不处理SQL,相互之间也不通信,它们的任务只是简单的响应高层传来的请求。存储引擎各自的一些特点 上面提到的四种存储引擎都有各自适用的环境,这取决于它们独有的一些特征。主要体现在性能、事务、并发控制、参照完整性、缓存、 故障恢复,备份及回存等几个方面目前比较普及的存储引擎是MyISAM和InnoDB.而MyISAM又是绝大部分Web应用的首选。MyISAM与InnoDB的主要的不同点在于性能和事务控制上。MyISAM是早期ISAM(Indexed Sequential Access Method,我现在用的MySQL5.0已经不支持ISAM了)的扩展实现,ISAM被设计为适合处理读频率远大于写频率这样一种情况,因此ISAM以及后来的MyISAM都没有考虑对事物的支持,排除了TPM,不需要事务记录,ISAM的查询效率相当可观,而且内存占用很少。MyISAM在继承了这类优点的同时,与时俱进的提供了大量实用的新特性和相关工具。例如考虑到并发控制,提供了表级锁,虽然MyISAM本身不支持容错,但可以通过myisamchk进行故障恢复。而且由于MyISAM是每张表使用各自独立的存储文件(MYD数据文件和MYI索引文件),使得备份及恢复十分方便(拷贝覆盖即可),而且还支持在线恢复。所以如果你的应用是不需要事务,处理的只是基本的CRUD操作,那么MyISAM是不二选择InnoDB被设计成适用于高并发读写的情况.使用MVCC(Multi-Version Concurrency Control)以及行级锁来提供遵从ACID的事务支持。InnoDB支持外键参照完整性,具备故障恢复能力。另外 InnoDB的性能其实还是不错的,特别是在处理大数据量的情况下,用官方的话说就是: InnoDB的CPU效率是其他基于磁盘的关系数据库存储引擎所不能比的。不过InnoDB的备份恢复要麻烦一点,除非你使用了4.1以后版本提供的Mulit-tablespace支持,因为InnoDB和MyISAM不同,他的数据文件并不是独立对应于每张表的。而是使用的共享表空间,简单的拷贝覆盖方法对他不适用,必须在停掉MYSQL后对进行数据恢复。使用Per-Table Tablespacesd,使其每张表对应一个独立的表空间文件,则情况要简单很多。一般来说,如果需要事务支持,并且有较高的并发读写频率,InnoDB是不错的选择。要是并发读写频率不高的话,其实可以考虑BDB,但由于在MySQL5.1及其以后版本中,将不再提供BDB支持。这个选项也就没有了至于Heap和BDB(Berkeley DB),相对来说,普及率不如前两种,但在有些情况下,还是挺适用的Heap存储引擎就是将数据存储在内存中,由于没有磁盘I./O的等待,速度极快。但由于是内存存储引擎,所做的任何修改在服务器重启后都将消失。 Heap挺适合做测试的时候使用BDB是MySQL第一款事务安全的存储引擎。在Berkeley DB database library的基础上建立,同样是事务安全的,但BDB的普及率显然不及InnoDB,因为大多数在MySQL中寻找支持事务的存储引擎的同时也在找支持MVCC或是行级锁定存储引擎,而BDB只支持Page-level Lock。 附上一张《High Performance MySQL》 中的各存储引擎的特性表 Attribute MyISAM Heap BDB InnoDB Transactions No No Yes Yes Lock […]
mysql tuner-primer
mysql下tuner-primer使用说明 mysql tuner-primer是检测mysql的主配置文件my.cnf的有力工具,当然还有其他工具,比如mysqlreport,今天先介绍这个工具的使用。下载并改变执行权限:wget http://www.day32.com/MySQL/tuning-primer.shchmod a+x tuning-primer.sh./tuning-primer.sh首先会要求输入服务器的用户名和密码,并提示保存在当前用户目录下配置文件。再次执行脚本就会运行,不用输入用户名和密码,并给出参数配置,强悍就强悍在这!!!!看看我的相关提示,[root@slave1 tuning-primer]# ./tuning-primer.sh – INITIAL LOGIN ATTEMPT FAILED –Testing Stored for passwords: None Found– RETRY LOGIN ATTEMPT FAILED –Could not auto detect login info!Do you have your login handy ? [y/N] : yUser: rootPassword: Would you like me to create a ~/.my.cnf file for you? [y/N] : y — […]
从编译到工具:几种Mysql的优化方法
一、在编译时优化mysql 如果你从源代码分发安装mysql,要注意,编译过程对以后的目标程序性能有重要的影响,不同的编译方式可能得到类似的目标文件,但性能可能相差很大,因此,在编译安装mysql适应仔细根据你的应用类型选择最可能好的编译选项。这种定制的mysql可以为你的应用提供最佳性能。 技巧:选用较好的编译器和较好的编译器选项,这样应用可提高性能10-30%。(mysql文档如是说) 1.1、使用pgcc(pentium gcc)编译器 该编译器(http://www.goof.com/pcg/)针对运行在奔腾处理器系统上的程序进行优化,用pgcc编译mysql源代码,总体性能可提高10%。当然如果你的服务器不是用奔腾处理器,就不必用它了,因为它是专为奔腾系统设计的。 1.2、仅使用你想使用的字符集编译mysql mysql目前提供多达24种不同的字符集,为全球用户以他们自己的语言插入或查看表中的数据。却省情况下,mysql安装所有者这些字符集,热然而,最好的选择是指选择一种你需要的。如,禁止除latin1字符集以外的所有其它字符集: —————————————————————————— %>./configure -with-extra-charsets=none [–other-configuration-options] —————————————————————————— 1.3、将mysqld编译成静态执行文件 将mysqld编译成静态执行文件而无需共享库也能获得更好的性能。通过在配置时指定下列选项,可静态编译mysqld。 —————————————————————————— %>./configure -with-mysqld-ldflags=-all-static [–other-configuration-options] —————————————————————————— 1.4、配置样本 下列配置命令常用于提高性能: —————————————————————————— %>cflags=”-o6 -mpentiumpro -fomit-frame-pointer” cxx=gcc cxxflags=”-o6 -mpentiumpro -fomit-frame-pointer -felide-constructors -fno-exceptions -fno-rtti” ./configure –prefix=/usr/local –enable-assembler –with-mysqld-ldflags=-all-static –disable-shared —————————————————————————— 二、调整服务器 确保运用正确的编译固然重要,但这只是成功的第一步,配置众多的mysql变量同样对服务器的正常运行起关键作用。你可以将这些变量的赋值存在一个配置文件中,以确保它们在每次启动mysql时均起作用,这个配置文件就是my.cnf文件。 mysql已经提供了几个my.cnf文件的样本,可在/usr/local/mysqld/share/mysql/目录下找到。这些文件分别命名为my-small.cnf、 my-medium.cnf、my-large.cnf和my-huge.cnf,规模说明可在描述配置文件适用的系统类型标题中找到。如果在只有相当少内存的系统上运行mysql,而且只是偶尔的用一下,那么my-small.cnf会比较理想,因为它命令mysqld 只使用最少的资源。类似地,如果你计划构建电子商务超市,而且系统拥有2g内存,那么你可能要用到mysql-huge.cnf文件了。为了利用这些文件中的一个,你需要复制一个最适合需求的文件,改名为my.cnf。你可以选择使用配置文件三种作用范围的一种: global:将my.cnf文件复制到服务器的/etc目录下,这使得配置文件中的变量作用于全局,即对所有服务器上的mysql数据库服务器有效。 local:将my.cnf文件复制到[mysql-install-dir]/var/目录下,使得my.cnf作用于特定的服务器。[mysql-install-dir]表示mysql安装目录。 user:你可以再限制作用于特定的用户,将my.cnf复制到用户的根目录下。 究竟如何设置my.cnf中的这些变量呢?更进一步说,你可以设置哪一个变量。虽然所用变量对mysql服务器相对通用,每一个变量与mysql的的某些组件有更特定的关系。如变量max_connects归在mysqld类别下。执行下列命令即可知道: —————————————————————— %>/usr/local/mysql/libexec/mysqld –help —————————————————————— 它显示大量的选项及与mysqld相关的变量。你可以很容易地在该行文字之下找出变量: ——————————————————————- possible variables for option –set-variable (-o) are ——————————————————————- 然后你可以如下设置my.cnf中的那些变量: ——————————————————————- set-variable = max_connections=100 ——————————————————————- 它设置mysql服务器的最大并发连接数为100。要确保在my.cnf文件中的[mysqld]标题下插入变量设置。 三、表类型 很多mysql用户可能很惊讶,mysql确实为用户提供5种不同的表类型,称为dbd、heap、isam、merge和myiasm。dbd归为事务安全类,而其他为非事务安全类。 3.1、事务安全 dbd berkeley db(dbd)表是支持事务处理的表,由sleepycat软件公司(http://www.sleepycat.com)开发。它提供mysql用户期待已久的功能-事务控制。事务控制在任何数据库系统中都是一个极有价值的功能,因为它们确保一组命令能成功地执行。 3.2、非事务安全 heap heap表是mysql中存取数据最快的表。这是因为他们使用存储在动态内存中的一个哈希索引。另一个要点是如果mysql或服务器崩溃,数据将丢失。 isam isam表是早期mysql版本的缺省表类型,直到myiasm开发出来。建议不要再使用它。 […]
Get Working day difference for 2 dates
CREATE DEFINER=`root`@`%` FUNCTION `getworkdaydiff`(b date, a date) RETURNS int(11)DETERMINISTICCOMMENT ‘Get Working day difference for 2 dates’BEGINDECLARE freedays int;SET freedays = 0; SET @x = DATEDIFF(b, a);IF @x<0 THENSET @m = a;SET a = b;SET b = @m;SET @m = -1;ELSESET @m = 1;END IF;SET @x = abs(@x) + 1;/* days in first week */SET @w1 […]
mysql ip address convert (ip2bigint,bigint2ip)
Convert IP address to bigint CREATE FUNCTION `F_Ip2Int`(ip varchar(15)) RETURNS bigint(20)BEGIN declare tmp bigint default 0; while instr(ip,’.’)>0 do set tmp = tmp*256+ left(ip,instr(ip,’.’)-1); set ip = right(ip,length(ip)-instr(ip,’.’)); end while; set tmp = tmp*256+ip; return tmp;ENDConvert bigint to IP Address CREATE FUNCTION `F_Int2Ip`(iip bigint) RETURNS varchar(15)BEGIN return concat((iip & 0xFF000000)>>24, ‘.’, (iip & 0x00FF0000)>>16, ‘.’, (iip & 0x0000FF00)>>8, ‘.’, iip & 0x000000FF);END
用mysqldumpslow分析mysql的slow query log
mysql有一个功能就是可以log下来运行的比较慢的sql语句,默认是没有这个log的,为了开启这个功能,要修改my.cnf或者在mysql启动的时候加入一些参数。如果在my.cnf里面修改,需增加如下几行 long_query_time = 1log-slow-queries = /var/youpath/slow.loglog-queries-not-using-indexes long_query_time 是指执行超过多久的sql会被log下来,这里是1秒。log-slow-queries 设置把日志写在那里,可以为空,系统会给一个缺省的文件host_name-slow.log,我生成的log就在mysql的data目录log-queries-not-using-indexes 就是字面意思,log下来没有使用索引的query。 把上述参数打开,运行一段时间,就可以关掉了,省得影响生产环境。 接下来就是分析了,我这里的文件名字叫host-slow.log。先mysqldumpslow –help以下,俺主要用的是-s ORDER what to sort by (t, at, l, al, r, ar etc), ‘at’ is default-t NUM just show the top n queries-g PATTERN grep: only consider stmts that include this string -s,是order的顺序,说明写的不够详细,俺用下来,包括看了代码,主要有c,t,l,r和ac,at,al,ar,分别是按照query次数,时间,lock的时间和返回的记录数来排序,前面加了a的时倒叙-t,是top n的意思,即为返回前面多少条的数据-g,后边可以写一个正则匹配模式,大小写不敏感的 mysqldumpslow -s c -t 20 host-slow.logmysqldumpslow -s r -t […]
MySQL-Cluster集群研究
MySQL-Cluster集群研究 from: discuz wiki一、介绍这篇文档旨在介绍如何安装配置基于2台服务器的MySQL集群。并且实现任意一台服务器出现问题或宕机时MySQL依然能够继续运行。 注意! 虽然这是基于2台服务器的MySQL集群,但也必须有额外的第三台服务器作为管理节点,但这台服务器可以在集群启动完成后关闭。同时需要注意的是并不推荐在集群启动完成后关闭作为管理节点的服务器。尽管理论上可以建立基于只有2台服务器的MySQL集群,但是这样的架构,一旦一台服务器宕机之后集群就无法继续正常工作了,这样也就失去了集群的意义了。出于这个原因,就需要有第三台服务器作为管理节点运行。 另外,可能很多朋友都没有3台服务器的实际环境,可以考虑在VMWare或其他虚拟机中进行实验。 下面假设这3台服务的情况: Server1: mysql1.vmtest.net 192.168.0.1Server2: mysql2.vmtest.net 192.168.0.2Server3: mysql3.vmtest.net 192.168.0.3 Servers1和Server2作为实际配置MySQL集群的服务器。对于作为管理节点的Server3则要求较低,只需对Server3的系统进行很小的调整并且无需安装MySQL,Server3可以使用一台配置较低的计算机并且可以在Server3同时运行其他服务。二、在Server1和Server2上安装MySQL从http://www.mysql.com上下载mysql-max-4.1.9-pc-linux-gnu-i686.tar.gz 注意:必须是max版本的MySQL,Standard版本不支持集群部署! 以下步骤需要在Server1和Server2上各做一次 # mv mysql-max-4.1.9-pc-linux-gnu-i686.tar.gz /usr/local/# cd /usr/local/# groupadd mysql# useradd -g mysql mysql# tar -zxvf mysql-max-4.1.9-pc-linux-gnu-i686.tar.gz# rm -f mysql-max-4.1.9-pc-linux-gnu-i686.tar.gz# mv mysql-max-4.1.9-pc-linux-gnu-i686 mysql# cd mysql# scripts/mysql_install_db –user=mysql# chown -R root .# chown -R mysql data# chgrp -R mysql .# cp […]
提高mysql性能的方法!
提高mysql性能的方法! 来自:chinaunix 作者:uunguymadman007风云使者 一、问题的提出在应用系统开发初期,由于开发数据库数据比较少,对于查询SQL语句,复杂视图的的编写等体会不出SQL语句各种写法的性能优劣,但是如果将应用系统提交实际应用后,随着数据库中数据的增加,系统的响应速度就成为目前系统需要解决的最主要的问题之一。系统优化中一个很重要的方面就是SQL语句的优化。对于海量数据,劣质SQL语句和优质SQL语句之间的速度差别可以达到上百倍,可见对于一个系统不是简单地能实现其功能就可,而是要写出高质量的SQL语句,提高系统的可用性。在多数情况下,Oracle使用索引来更快地遍历表,优化器主要根据定义的索引来提高性能。但是,如果在SQL语句的where子句中写的SQL代码不合理,就会造成优化器删去索引而使用全表扫描,一般就这种SQL语句就是所谓的劣质SQL语句。在编写SQL语句时我们应清楚优化器根据何种原则来删除索引,这有助于写出高性能的SQL语句。二、SQL语句编写注意问题下面就某些SQL语句的where子句编写中需要注意的问题作详细介绍。在这些where子句中,即使某些列存在索引,但是由于编写了劣质的SQL,系统在运行该SQL语句时也不能使用该索引,而同样使用全表扫描,这就造成了响应速度的极大降低。1. IS NULL 与 IS NOT NULL不能用null作索引,任何包含null值的列都将不会被包含在索引中。即使索引有多列这样的情况下,只要这些列中有一列含有null,该列就会从索引中排除。也就是说如果某列存在空值,即使对该列建索引也不会提高性能。任何在where子句中使用is null或is not null的语句优化器是不允许使用索引的。2. 联接列对于有联接的列,即使最后的联接值为一个静态值,优化器是不会使用索引的。我们一起来看一个例子,假定有一个职工表(employee),对于一个职工的姓和名分成两列存放(FIRST_NAME和LAST_NAME),现在要查询一个叫比尔.克林顿(Bill Cliton)的职工。下面是一个采用联接查询的SQL语句,select * from employsswherefirst_name||”||last_name =’Beill Cliton’ 上面这条语句完全可以查询出是否有Bill Cliton这个员工,但是这里需要注意,系统优化器对基于last_name创建的索引没有使用。当采用下面这种SQL语句的编写,Oracle系统就可以采用基于last_name创建的索引。Select * from employeewherefirst_name =’Beill’ and last_name =’Cliton’ 遇到下面这种情况又如何处理呢?如果一个变量(name)中存放着Bill Cliton这个员工的姓名,对于这种情况我们又如何避免全程遍历,使用索引呢?可以使用一个函数,将变量name中的姓和名分开就可以了,但是有一点需要注意,这个函数是不能作用在索引列上。下面是SQL查询脚本:select * from employeewherefirst_name = SUBSTR(‘&&name’,1,INSTR(‘&&name’,’ ‘)-1)andlast_name = SUBSTR(‘&&name’,INSTR(‘&&name’,’ ‘)+1) 3. 带通配符(%)的like语句同样以上面的例子来看这种情况。目前的需求是这样的,要求在职工表中查询名字中包含cliton的人。可以采用如下的查询SQL语句:select * from employee where last_name like ‘%cliton%’ 这里由于通配符(%)在搜寻词首出现,所以Oracle系统不使用last_name的索引。在很多情况下可能无法避免这种情况,但是一定要心中有底,通配符如此使用会降低查询速度。然而当通配符出现在字符串其他位置时,优化器就能利用索引。在下面的查询中索引得到了使用:select * from employee where last_name like […]
mysqlbinlog 資料庫處理二進制日誌檔案的實用工具
當然,系統剛弄好是沒有開啟 mysqlbinlog 的功能,至少在 CentOS4.4 上面我還要去開啟,不過 ubuntu 系統預設就已經開啟了,不過沒關係,只要利用下面方法就可以達到了 修改 my.cnf [ CentOS: /etc/my.cnf Ubuntu: /etc/mysql/my.cnf ],加入下面語法 # Replication Master Server (default)# binary logging is required for replicationlog-BIN=mysql-BIN 不過話說當你開啟這個功能之後,你會發現在 /var/lib/mysql/ 底下多出很多檔案 -rw-rw—- 1 mysql mysql 33164904 1月 17 15:44 mysql-bin.000001-rw-rw—- 1 mysql mysql 4007 1月 17 15:50 mysql-bin.000002-rw-rw—- 1 mysql mysql 70288989 1月 29 22:38 […]