易栈网-膘叔

浏览模式: 标准 | 列表 | 图文
身为WEB开发人员,真是痛苦,ietester解决部分痛苦

身为WEB开发人员,真是痛苦,ietester解决部分痛苦

身为一个WEB开发人员,最痛苦的是什么?不是那些程序,而是程序在不同的浏览器里所需要达到的效果。看看现在有多少浏览器吧,咱们先不谈那些在linux下面使用的浏览器。不是说不照顾他们,而是,他们使用的核心也大多差不多,再加上使用量确实少,咱们就先忽略一下。希望不要生气。
IE是市场份额最大的浏览器了吧。自从畅游推出了MYIE并开源之后,国内多窗口浏览器的发展就开始蒸蒸日上了,什么gb,tw,maxthon等等等等。这是FOR IE核心的。
非IE核心的,大多是三种GEKEO,webkit,opera三大阵营,算是使用量特别多的。
因此,作为一个WEB开发人员,就不得不考虑这四大类型的浏览器,而其实,问题最多的还是IE,毕竟其他的三个核心还算是遵守W3C规范,而IE就只能算是特立独行,却偏偏它所占的市场份额最高。
IE,如果就一个IE,那也就算了,可是从IE5.5开始,6、7、8没有一个是完全一样的,所遵从的规范也都不一样,这才是痛苦之源。
推荐一个软件Ietester,整合了4个核心的IE,。5.5、6、7、8beta2,这回,测试的时候可以方便一点,最起码一个程序可以完成以前的效果(仅仅是测试而己)。
其他的我不介绍,这里只有截图。。。
7d8e79d4311db07d51119a4eb56344fe
网址是:http://www.my-debugbar.com/wiki/IETester/HomePage

已知问题:

Known problems and limitations :

  • When resizing, the content may disappear. I am working to correct it on the next version.
  • The Previous/Next buttons are not working properly
  • Focus is not working properly
  • Java applets are not working
  • Flash is not working on IE6 instance.

希望可以给WEB开发者带来方便。

全屏截图:

c12ee2f684f4f376e9218a226e25689b

精通MYSQL数据库——连载六

精通MYSQL数据库——连载六

介绍完表的结构和存放位置后,下面的内容就是介绍MYSQL的数据类型了,毕竟为你想要的数据选定一个合适的类型,对于数据库的存取效率有很大的改进。
MYSQL数据库有以下几种类型:整数型(int,binint,smallint,tinyint等等xxxint型)、浮点型(float,double,real等)、定点数型(decimal,也就是传说中的浮点型的字符串表达形式)、日期与时间型(data,time,datetime,timestamp),字符串型(char,varchar,text,tinytext,mediumtext,longtext等),二进制型(tinyblob,tinyblob,blob等blob型),枚举型(enum,set——set是类似于enum型)。

下面从整数型开始详细介绍这些数型的基本信息:
整数型
默认情况下,INT类型既包括正数,也包括负数,如果给INT列定义UNSIGNED属性,那么它的取值范围就永远是正数。这个永远是正数,非常重要,即,如果你在对数据列操作:update tablename set int_field = (int_field - 1000 ),如果int_field的值小于1000,理论上是变成了负数,但由于你设的属性是UNSIGNED,那么存储的数据仍然是无符号的正数,这可能会给你带来虚假或让人困惑的结果。
TINYINT的取值范围是从-128~+127,如果使用了UNSIGNED属性,那么它的取值范围就变成了0~+255。如果用户试图存入超过字段取值范围的数字,MYSQL所做的工作就非常简单,它会直接替换成最大可取值或最小可取值。
或许有人注意到,我们在使用phpmyadmin的时候,如果选择INT类型,那么后面有一个可选长度。不过,千万不要被这个数值所迷惑,因为它的实际功能并非指定该INT类型的长度,而是最大显示宽度(M:Maximum Display Width),仅仅用于查询数据时可以把查询结果按照你所指定的宽度进行显示,最主要的用途是为了排版需要。虽说是这样,但在一些很少见的特定场合(MYSQL在执行一些需要借助于临时数据表才能完成的复杂查询)里,临时数据表的数值有可能会被截短并导致最终结果不正确。因此,除非你与数据库所有的操作都在命令行下执行,否则,还是建议留空。

INT 类型 该类型的实际含义
Tinyint(m) 8位整数,占用1个字节(-128~+127)
smallint(m) 16位整数,占用2个字节(-32768~+32767)
medimumint(m) 24位整数,占用3个字节(-8388608~+8388607)
int(m),integer(m) 32位整数,占用4个字节(-2147483648~+2147483647)
bigint(m) 64位整数,占用8个字节(-9.22E+18 ~ +9.22E+18)
serial 这其实是bigint auto_increment not null primary key的简写

上面tinyint(m)括号中的m,就是上文所指的最大显示宽度。最后一个serial含义里的auto_increment,代表了该字段是自增字段,即,往有该属性的字段里插数据时,系统会自动把该字段的当前最大值加上1后存进去。 一般而言,该属性往往用于主键字段。在使用该属性时应当注意以下几个问题。
1、该属性必须与NOT NULL、primary Key 或者 Unique属性同时使用。
2、每个数据表只能存有一个auto_increment属性的数据列
3、该属性一般是在进行数据插入时,没有明确指定值或者指定值为NULL时,才起作用。如果指定了值,并且该值还没有出现过,MYSQL将使用该值插入,以生成一条新记录。这时候就有两种情况:a)原有的数据是1~100,后来删除了20~80的内容,即数据库里只存在1~19,81~100的数据,当插入ID为20的数据时,数据库还是会按照规则,把20这条记录插进去,并不会报错,自增值仍然是100,下次正常插入时,还是会默认使用101这个值。b)原有的数据是1~100,我插入ID为1000的数据时,不会报错,但自增值变为1000,下次插入数据从1001起算。(啰嗦了点,但应该记住)
4、如果想知道刚刚插入的数据值是多少,在插入数据后,可以使用select last_insert_id()语句获取。在PHP中,有一个函数是:mysql_insert_id(),该函数不是很建议使用,因为它返回的数据是INT型,如果auto_increment所在的数据列类型是bigint,而且实际值已经超过int类型最大值的话,mysql_insert_id()返回的值,将不正确。
5、如果auto_increment计数器达到了最大值(即该字段所允许的最大值),将不再递增,因此数据插入将无法执行。其实是到了最大值后,MYSQL会永远将该字段的最大值往数据库里插,因此造成MYSQL报:该数据列已存在的错误。
6、如果在可行范围内,或者预计数量会很大的情况下,尽量使用你想要设定的数据类型的再上一层类型,但尽量不要太夸张。比如你预计你的用户数不会超过1000000万,表面上medimum无符号已经够用了,但这时候,仍然建议你使用int型,以防万一。

打字很累,剩下的留到以后慢慢讲。。。

差点忘了。。。还有个BIT和BOOL,在MYSQL中,关键词BOOL是TINYINT的同义词,在5.0.2以及以前的版本中,BIT也是如此。但是从5.0.3开始,BIT不再是TINYINT的同义词,而是一种可以存储多达64位二进制数值的新数据类型。这个在以后会单独介绍,这里一笔带过先。

精通MYSQL数据库——连载五

精通MYSQL数据库——连载五

明天,就是俺结婚2周年的纪念日了,为了感谢大家的支持,所以。今天再开放一篇连载。黑黑

介绍完MYSQL所支持的一些数据表类型,再介绍一下数据表文件的存放等资料。

MYSQL对于数据表的存放一般而言都是很有规律的,在*nix系统下面,通常在/var/lib/mysql子目录,而在windows平台下一般都在mysql安装目录下的子目录/data/里。

(写了一半,发现都需要用到数据存放目录,现在假设数据存放目录为/data/)

一般而言,每一个数据表都有一个和表名对应的frm文件,而这些数据表都是存储在以它本身所在数据库为名的目录里。例如:User数据库下的members表,一般都存储在数据库目录下的/User/下,名字为members.frm(全路径为:/data/User/members.frm)。frm文件是整个数据库的结构定义和设置。

如果是myisam数据表,那么还会创建两个以数据表命名的文件,*.MYD,*.MYI,其中MYD文件用来存放MYISAM数据表的数据,而MYI文件用来存放索引(该表的所有索引)。

如果是innoDB数据表的话,就需要根据MYSQL配置文件中的innodb_file_per_table的选项设置情况而定。它既可以各自存为一个文件,也可以统一存放在所谓的表空间(tablespace)里。表空间的存放位置和名字由配置决定。如果没有做任何设置的话,默认是innodb数据表的数据和索引存放在/data/dbname/tablename.idb文件里,而把表空间和撤销日志(undo log)存放在/data/ibdata1,/data/ibdata2/...等文件里,而把innodb的日志数据存放在/data/ib_logfile0 ,/data/ib_logfile1这样有规则的文件里。

在如今的版本里,如果你定义了触发器,那么它们存放在/data/databasename/tablename.TRG文件里。新版本据说可能会发生变化。

[精][转]Apache多虚拟主机的简单配置

[精][转]Apache多虚拟主机的简单配置

打开google reader,好开心,发现一篇精品文章,不敢独享,放上来。毕竟,独乐乐不如众乐乐嘛。没看这篇文章之前,我一直没有想通,那些空间商是怎么让一个用户注册一下就生成一个空间,而不用重启apache的。这一直是我的心头疑问,直到看到这篇文章的黑体字,所以。。。。转摘一下,哈哈

作者:FinalBSD
日期:2008-09-11
原文地址:http://www.sanotes.net/html/y2008/181.html
需求:
一台apache上要服务很多的虚拟主机,这些虚拟主机的域名具有规律性,比如说是:xxx.example.com

实现:
使用mod_rewrite进行跳转
优点:
* 不需要为每一个虚拟主机配置一段;
* 新增了vhost不需要重启apache,只需要编辑vhosts.map即可;

缺点:
* 无法为特定的vhosts设定具体配置

配置:

RewriteEngine On
RewriteMap lowercase int:tolower

RewriteMap vhost txt:/usr/local/etc/apache22/vhost.map
RewriteCond ${lowercase:%{SERVER_NAME}} ^(.+)$
RewriteCond ${vhost:%1} ^(/.*)$
RewriteRule ^/(.*)$ %1/$1

/usr/local/etc/apache22/vhost.map的内容是:

site1.example.com /usr/local/www/data/1
site2.example.com /usr/local/www/data/2
site3.example.com /usr/local/www/data/3
site4.example.com /usr/local/www/data/4
site5.example.com /usr/local/www/data/5
site6.example.com /usr/local/www/data/6

原理:
1.构建2个映射表,分别是lowercase和vhost;
2.对每个URL进行RewriteCond检查,比如http://Site5.Example.com/index.html
2.1 第一条RewriteCond:

RewriteCond ${lowercase:%{SERVER_NAME}} ^(.+)$

1)这里首先查询lowercase表,lowercase表属于int类型,使用apache内部函数tolower将

key:Site5.Example.com替换为value:site5.example.com.

2)查完之后用查询到的Value进行RewriteCond判断

input='site5.example.com' pattern='^(.+)$' => matched

2.2 第二条RewriteCond:

RewriteCond ${vhost:%1} ^(/.*)$

1)这里首先查询vhost表,vhost表属于txt类型,key:site5.example.com对应value为/usr/local/www/data/5.
2)查完之后用查询到的value进行RewriteCond判断

input='/usr/local/www/data/5' pattern='^(/.*)$' => matched

3.在2条RewriteCond都符合的情况下,执行RewriteRule规则:

RewriteRule ^/(.*)$ %1/$1

将/下面的所有文件重写到%1/$1,这里的
%1:是上一个RewriteCond的value:/usr/local/www/data/5
$1:即(.*)的括号里面的内容,即请求的文件名
最终的执行为:

rewrite '/index.html' -> '/usr/local/www/data/5/index.html'

可以看详细的日志了解整个过程。
requested uri /index.html

192.168.1.2 - - [11/Sep/2008:22:09:25 +0800] [site5.example.com/sid#2840feb8][rid#28cbe050/initial] (3) applying pattern '^/(.*)$' to uri '/index.html'
192.168.1.2 - - [11/Sep/2008:22:09:25 +0800] [site5.example.com/sid#2840feb8][rid#28cbe050/initial] (5) map lookup OK: map=lowercase key=site5.example.com -> val=site5.example.com
192.168.1.2 - - [11/Sep/2008:22:09:25 +0800] [site5.example.com/sid#2840feb8][rid#28cbe050/initial] (4) RewriteCond: input='site5.example.com' pattern='^(.+)$' => matched
192.168.1.2 - - [11/Sep/2008:22:09:25 +0800] [site5.example.com/sid#2840feb8][rid#28cbe050/initial] (6) cache lookup FAILED, forcing new map lookup
192.168.1.2 - - [11/Sep/2008:22:09:25 +0800] [site5.example.com/sid#2840feb8][rid#28cbe050/initial] (5) map lookup OK: map=vhost[txt] key=site5.example.com -> val=/usr/local/www/data/5
192.168.1.2 - - [11/Sep/2008:22:09:25 +0800] [site5.example.com/sid#2840feb8][rid#28cbe050/initial] (4) RewriteCond: input='/usr/local/www/data/5' pattern='^(/.*)$' => matched
192.168.1.2 - - [11/Sep/2008:22:09:25 +0800] [site5.example.com/sid#2840feb8][rid#28cbe050/initial] (2) rewrite '/index.html' -> '/usr/local/www/data/5/index.html'
192.168.1.2 - - [11/Sep/2008:22:09:25 +0800] [site5.example.com/sid#2840feb8][rid#28cbe050/initial] (2) local path result: /usr/local/www/data/5/index.html
192.168.1.2 - - [11/Sep/2008:22:09:25 +0800] [site5.example.com/sid#2840feb8][rid#28cbe050/initial] (1) go-ahead with /usr/local/www/data/5/index.html [OK]

Reference:Apache模块 mod_rewrite

更强大的方法:使用mod_vhost_alias(由Tonny推荐):

UseCanonicalName Off
VirtualDocumentRoot /usr/local/www/data/%0

那么对http://site1.example.com/file.html的请求将会返回文件/usr/local/www/data/site1.example.com/file.html
Reference:Apache模块 mod_vhost_alias

Appendix:比较专业的模块(i_amok推荐)
http://www.oav.net/projects/mod_vhs/

精通MYSQL数据库——连载四

精通MYSQL数据库——连载四

Heap数据表只存在于内存中,它主要的用途是充当临时数据表。它采用了散列索引(hash index),这使得数据的存取速度非常快。heap表与临时表还是有区别的,它对于访问数据库的连接是永远可见的,即使连接丢失,表也不会消失。
虽然它的存取速度是最快的,但缺点也同样的明显。
1、因为使用的是内存,所以一旦断电或出现意外的时候,里面的数据将全部丢失
2、因为使用内存,所以text字段和blob字段是不允许使用的
3、对于heap表,只能使用 = 和 <=> 操作符来进行记录的搜索,而不能使用 < , > ,<= ,>= 这些操作符
4、heap表不允许有自增字段
5、heap表的大小有限制,通过mysql配置文件中的:max_heap_table_size来决定

临时数据表,一般是指采用create temporary table或者mysql为了存储中间结果而临时创建的数据表,表的类型可以是myisam,innodb,heap三种类型中的任何一种。这种数据表在MYSQL意外掉电的时候,一般不会消失(除了heap表),但MYSQL正常关机、MYSQL连接结束、MYSQL执行意外中断时,都将全部丢失。另外,这种数据表对于访问同一个数据库的MYSQL连接是不可见的,不同的用户即使创建相同名字的临时表而不会发生冲突,这点就与heap有区别。因为heap表是可见的,所以不能创建两个相同名字的heap表。
一般而言,人们提到的“临时表”更多的是指MYSQL为了保存select查询的中间结果而自动创建的临时表。因为在实际运用当中,很少会主动创建这些临时表。
临时表的存储也和MYSQL默认的存储位置不一样,在windows下面,一般来说是在c:\windows\temp目录下,而在unix/linux环境里通常在/tmp或/var/tmp/或/usr/tmp目录下。这个子目录是可以在mysql启动时进行配置。

除了上面这些常用的数据表类型,mysql还支持一些其他数据表,但这需要自行编译时加入或者直接使用MAX版本的数据库。要想知道你的数据库支持哪些类型的数据表,你可以通过执行:show engines来查看。
MYSQL所支持的数据表还有:BDB表,ARCHIVE表(压缩数据表,从4.1开始支持),CSV表(4.1开始支持),NDB表(mysql集簇,4.1开始支持),FEDERATED表(外部数据表,5.0开始支持)
下面简单的介绍一下,都是看来的,因为我都没有用过,黑黑
1、BDB表,这是最早具备事务功能的MYSQL数据表,但随着innodb驱动的日趋成熟,BDB已经几乎没有人使用了。
2、ARCHIVE表,和前面的提到的Mysql Compress表差不多,都是用于保存和备份数据而设计的。这种类型的表的优点是在保存数据之前会先对数据记录进行压缩。它只允许使用INSERTR命令,不允许执行UPDATE和DELETE命令。因为该表不允许数据被修改,同时,ARCHIVE表不支持索引,如果要进行SELECT操作,就必须遍历全部数据。因此,它只适合用于一些数据访问量很小的场合。
3、CSV表,这种类型大家应该很熟悉了,在使用excel的时候,就可以把数据存为CSV文件,一般采用逗号分割。基本上就是一文本文件,所以不支持索引功能。
4、NDB表。NDB集成在MYSQL MAX的版本中,是属于mysql集簇功能中的一种。NDB是英文network database的缩写,由名字也可以看出,它一般用来建设数据分布在大量计算机上的网络数据库,该表类型支持事务功能。如果需要使用该功能,必须在多台装有mysql max版本的联网计算机,并配置使他们都支持集簇功能时,才可以使用。
5、FEDERATED表。这种表的类型可以让用户去访问外部数据库里的数据表,而那个数据库系统可以位于本地网络中的另一台计算机上。在目前的MYSQL版本里,该功能所支持的外部数据库也必须是MYSQL,但未来,应该是可以支持更多版本。个人感觉,这就象一个proxy一样。在现有的版本里,通过FEDERATED进行的查询和事务都没有办法使用Query Cache工具优化,也不支持外部数据表的结构修改,但可以修改数据。即使用FEDERATED表时,不能使用alter table命令,但可以使用insert,update和delete命令。

最多的信息,也可以查看:http://dev.mysql.com/doc/mysql/en/storag-engines.html。

接下去就是介绍数据表文件和MYSQL所支持的一些数据类型了。

@neatdns.com邮箱开放注册

@neatdns.com邮箱开放注册

前段时间搞的phpoo.com,好象,没有办法使用mail.phpoo.com进行访问,在网上查找了一下原因才发现,原来,google.com提供的cname,在国内是无法访问的,所以,只能通过https://mail.google.com/a/phpoo.com来进行访问,一下子感觉好不方便啊。

于是跑到live.com上面申请live domains的服务,而且,还能用来当作live messae的ID哦。现在已经开放申请了。
在每个内容详细页面,右边都有一个申请的图标,点击sign up,就可以开使申请了。

这个域名,我该用来提供一些其他什么服务呢?真犹豫啊。

谁给我点好建议?

纪念那逝去的生命

纪念那逝去的生命

今天,又是911了,不知道这个日子大家还能记得多少,不过我想估计大家也就记得:摩天大楼断层,五角大楼缺角吧。但更多的,我还是想起了那些逝去的生命。

从军五年,虽然没有上过火场,但身边或者周围还是经常可以看到,住在虹口的时候,也是动不动就看到消防队员的出动。每年也基本上都会去公安博物馆参观一下,怀念一下那些英模和英烈。基本上每年也都有消防队员的生命在救灾中消失,也很痛苦。和平年代,消防兵应该算是最危险的兵种了吧。可是国内每年都在播放纪念这种部队纪念那种部队,却没有人会拍电影来反映一下消防部队的。

香港、美国都曾拍过烈火雄心之类的电影,可是我们国内呢?虽然在国外,消防并不是兵种之一,只是一种职业,但这种职业却是十分高尚的,也是最危险的。即使911的时候,也是消防队员最早冲进去救人。

又发牢骚了。再次纪念一下那些逝去的生命。

精通MYSQL数据库——连载三

精通MYSQL数据库——连载三

前两天我们介绍了myisam和innodb两种类型的表结构,可是:to be or not to be ,that's a question。

在我的实际应用中,我到底应该选择哪个呢?用myisam还是innodb,确实是让人伤脑筋的问题。所幸,这两种表结构可以存在于同一个数据库中,DBA们也就可以根据实际应用来设计数据表是使用哪种类型的了。
虽然一般情况下认为myisam的存取速度超过innodb,但这也不是绝对的。确实innodb所占用的空间要比myisam大的多,但是相对的,innodb在存储数据时,是行锁定,而并非myisam的表锁定,所以,在这一点上,又不能说谁快谁慢了。
相对于安全性方面,innodb毫无疑问是首选,至少不用再担心多人同时操作表时会发生什么意外的状况了。可是从节约时间和空间上来选择,myisam又是远超innodb。
究竟应该选用哪种呢?实在是一个非常头疼的问题。所以说,一般情况下只能根据系统的需求来决定到底使用哪种类型的表结构。如果你为了追求速度,认为数据丢失一条两条无所谓,错误一下问题也不大,那么毋庸置疑,myisam是首选。如果需要用到事务,那innodb就是不得不选的。如果你实在没法确定需要哪种类型的表结构,那么,创建两个不同类型的表,逐步增加数据量的大小,多测试几个重要的SQL(以后系统中可能会使用的SQL),看看哪个效率更高就选择哪个。
虽然这些都是根据特性来选择的,但我们也不能忽略服务器自身的配置。如果服务器是8核、12G内存,却只用来处理一个小小的留言板,你还会在乎是使用哪种类型的表结构吗?

官方网站上也有关于这两种数据表在细节方面的优劣对比:http://dev.mysql.com/doc/mysql/en/innodb-restrictions.html
随便说说而己。。。明天继续介绍heap表和一些不常用的表结构类型。
今天是一个伟大的日子:教师节

今天是一个伟大的日子:教师节

今天是一个伟大的日子:教师节,小时候每到这个节日,都会向教师送送贺卡什么的。如今离开学校N久,虽然也在上夜大,但人和人之间的关系却变得淡漠了。
翻开几年前写的东西:

多少年来,老师给我们的印象一直是为人师表,传道解惑的崇高形象。随着这两年负面报道的逐渐增多,教师给我们的印象已经逐步改变。
新闻里的事迹不再是某某教师鞠躬尽瘁,相反却是某某老师象披着羊皮的狼,尽做着一些道貌岸然的事情。
其实就我自己而言,在我长大至今,有一些老师对我还是比较照顾的,这种照顾不是简单的关心或者其他,有的时候打骂反而成了一种依赖,当然打骂也要看人的。也有一部分老师动不动就打骂学生,求学生涯中这类老师也不少见。
曾经有位老师在看到我一同学上课玩那种玩具手枪后,把他叫出教室,打了一记耳光,问学生,我打你应不应该,学生回答不应该,接着又是一记耳光,再问,现在是不是应该。学生比较倔,结果脸就被打肿了。而该老师却一副理所当然的样子。这样的老师我就遇到好几个。其中还有一个是看到学生不听话,拎起学生笔盒就砸学生头,靠墙的就揪住头发往墙上装,以至于当时全班学生没有人敢买金属笔盒的,就这种情况下,该老师还要用脚踢学生。老师的名字我就不提了,后来我再回学校有事的时候,发现该老师已是学校教导主任。
提起教导主任,又让我想起学校的一位为人师表的人来,可能是因为年龄比较大吧,打骂学生有点力不从心,就改为掐,学生的耳朵因此而。。。。。。哎,不想多提。
有的时候我就在想,这些人怎么会当上老师的?难道仅仅因为他们有一定的能力就可以做这些事情吗?他们怎么可以这么做?打是亲骂是爱的时代早就不复存在了,为什么还要这么对待学生,难道是因为他们以前也是这么受苦,现在是报复行为?
话虽是这么说,但真正关心学生的老师还是挺多的,上面举的只是学校中的一些败类吧。印象中深刻的几位老师是:郑平(小学语文老师)、徐湘(初中数学老师)、张XX(初中英语老师)、汤进(中专物理老师),当然还有一些,只是自己愚鲁,而且记忆力不好,不再记得,只是依稀对他们的印象比较深刻。再多一份怀念 吧?
小时候学语文的时候,知道“桃李满天下”,更在屡见不鲜的作文里看到某老师退休后,经常有学生去看望他们,时不时的谈起学生时代的事情,往往哄笑一堂。如今,人的思想在进步,对教师的观念也在改变,如果教师仅仅只能传授知识,而无法在品德方面对学生有所教育的话,恐怕再也不会让学生有所相念了。
教师节又快到了,谨以此文献给那些关心过我和爱护过我的老师,同时希望他们能够平安一生。对那些刻薄的老师,也希望他们能够更好的关爱自己的学生,把学生当成自己的孩子来看待,才会得到更多的尊重。
一家之言。
老师,您珍重。

上面的内容是几年前写的,现在想想也算是想法和以前两样了。教师希望人成才,只是手法用的比较残忍而己。今年5·12的范跑跑教师让社会感到震惊,虽然他说出了实话,但得不到全国人民的理解,作为一个普通人,或许他这样没做,但是做为一个为人师表的老师,他这样带出来的学生,以后又怎能做到不自私自利呢?昨天收到手机新闻里的一条:说是现在教师上岗,师德将成为一个重要标准。说实话,师德,谁来评判?当那些教师拿着学生家长送的礼物或者其他时,即使他教的再好,算是有师德吗?不清楚。或许我又FQ了。
乱讲讲,乱讲讲,权当我在放狗屁

精通MYSQL数据库——连载二

精通MYSQL数据库——连载二

(今天晚上要读书,所以先发上来)

昨天我们讲的是myisam表的特性,今天我们来讲讲innodb的一些特性。

之所以要采用innodb,是因为innodb有一些新的特性,而这些特性又是myisam所不具备的,它们是:事务、数据行级锁定、外键约束、崩溃恢复
看到上面这些特性,你是不是基本了解了innodb所应用的范围了?是的,innodb所具备的这些特性,使得mysql即使在高端应用也有了用武之地,特别是在处理类似银行这些对事务非常关心,也非常重要的场合(存钱取钱以及转帐等),下面就对这些特性进行简单介绍。
在介绍特性之间,先说明一下,innodb虽然一直是MSYQL的集成组件之一,但事实上,innodb的驱动的研发和收费技术支持都是来自innodb公司:http://www.innodb.com,这可是一家独立的公司。
事务:在innodb里所有的操作都可以被看成是在执行一个事务,它允许把几条有内在逻辑关系的SQL当成一个整体来执行。所以执行期间发生错误,则所有的命令会全部失效,就好象从未执行过任何SQL一样,而不仅仅是导致错误的那一条命令。正因为这样,所以事务功能相对增强了数据库的安全性。mysql支持全部的4种事务级别(READ UNCOMMITTED,READ COMMITED,REPEATABLE READ , SERIALIZABLE)
数据行级锁定:在执行事务时,innodb表的驱动程序会使用内置的行级锁定机制,而不是采用mysql自身的行级锁定机制。也就是说即使在执行事务时,其他进程仍然可以访问它,因为被锁定的仅仅是那些正在接收事务处理的记录。这与mysql的lock table不一样,lock table执行完后,整个表都被锁定了。这两种方式的对比可以让你看出,如果有一大堆人在处理一个很大的数据表,孰优孰劣一看便知。并且,innodb的这个驱动相对比较先进的就是,它能够自动识别“死锁”(所谓死锁,就是两个进程各战胜一项对方需要的资源,同时又在等待对方先释放所占用的资源,结果导致两个进程都不能执行),并自动终止两个进程中的一个。这才是innodb的强项。
外键约束:如果在数据表间定义了关联,innodb驱动将自动保证数据表的引用一致性,即便在执行过delete后也能同样保持。也就是说,不可能出现在A表的记录引用B表一条并不存在的记录,这就是所谓的:外键约束
崩溃恢复:理论上,在数据库发生崩溃后,只要计算机的文件系统没有被破坏,innodb数据表能够迅速地自动恢复到一个稳定可用的状态。说明一下,这只是理论上,具体怎么样,我没有测试过,也没有搜索到相关文章,如果有人搜索到相关的资料,请告知,以便我更新一下,谢谢。
说了这么多的特性,下面也要谈谈它的缺点,毕竟凡事都有双面性,有优点自然也会存在缺点,否则,谁还会用myisam?
使用innodb有以下几个缺点:
1、表空间的管理。与myisam分成三个文件的存储方式不一样,innodb把所有的数据、索引、结构都存在了一个表空间里。当然,表空间可以是一个或多个文件组成,也就是说这些文件组成了一个虚拟的文件系统。然而问题就出在这里,这些文件被创建后只能增长,不能缩小。如果想复制innodb表,只有使用mysqldump来进行处理,而myisam在停掉数据库后,直接复制就可以了(好象到了4.1或5.0后,这样的直接复制好象不行了?我是指两个表的设置如果不一样的话)
2、数据记录的长度。innodb的单条记录最多占用8000个字节。这个限制不包括text和blob等类型字段,事实上,这此字段只有前512个字节和其他数据存在数据库里,超过这个长度的内容都是被存储在上面所说的“虚拟文件系统——表空间”的其他文件里面。在这里,有一个回复,也可以参考一下,虽然不一定完全正确:http://imysql.cn/node/548,呵呵。
3、存储空间。在内容相同的情况下,一般来说innodb所占用的空间要比myisam所占用的大的多,最多时,可能会有两倍。
4、全文索引。这恐怕是它最大的缺憾了,innodb不支持full-text index。
5、GIS数据。存储和读取这个,还是myisam来的更方便一点,所以innodb也不支持它。
6、COUNT相关。innodb在处理SELECT COUNT(*) FROM table的时候,比myisam慢得多,这主要是因为它支持事务。可是,我在用sql server的时候也没有慢很多嘛。不知道它何时能够被解决,否则在内容较大的时候,处理分页就烦了。
7、表锁定。因为innodb有自己的表锁定算法,所以想使用表锁定功能时,用innodb所支持的select .. for update或select .. IN share mode,而不要使用mysql 自带的lock table。
8、虽然有这么多好处,可惜mysql这张表,还是得用myisam格式。而不能使用innodb
9、费用。。。。对于我们个人来说,我们只需要使用免费的mysql,而不是使用商业版的mysql,那么收费就与我们无缘了。至于商业应用嘛,那,钱是少不了的,听说,如果在mysql许可证里加上innodb支持,将收取双倍费用。好恐怖。。。
上面的这些也是我在参考书本后,进行的整理,否则,凭我这些小小的经验,怎么可能了解这么多?