手机浏览 RSS 2.0 订阅 膘叔的简单人生 , 腾讯云RDS购买 | 超便宜的Vultr , 注册 | 登陆
浏览模式: 标准 | 列表2024年09月的文章

慎用mysql的enum字段

这两天有趣的事情非常多,比如,所谓的QQ一些内部培训资料流出,网上各大网盘啥的流量一下子就非常高了。我当然也不小心就下载了一份,还没有看,不过好象什么百度的资料上已经有在线看了。因为自己也没有看,所以也不太清楚这玩意是真是假。

OK,上正文,16日的MYSQL专场,对于mysql优化讲的较详细的应该算是杨涛涛,他对MYSQL的一些字段类型进行了些介绍,包括他们所含 的字节长度,来介绍给我们让我们了解如何对数据库进行优化,比如,尽量不要用bigint,因为,这在项目中几乎不可能会被用上而他们占的字节长度却是在int中最长的,在数据量大的时候,既占空间,又影响速度。

还介绍了datetime和timstamp等的区别(更多可以看我以前写的连载,里面也有介绍)

不过,他唯独没有提起ENUM字段,说起这个ENUM,它倒是mysql的一个特色字段,在以前很多人喜欢用它,因为他可以设置字段的区间范围,会让值可以被数据库所控制,不至于出现意料不到的值(比如,字段只想有0和1,结果出现了2,那2就是赃数据了)

但ENUM带来的问题也不少,比如数据迁移的时候,他几乎不可能被其他数据库所支持,如果enum里面是字符串,对于其他数据库来说就更郁闷了,还不能设为tinyint等类型的字段(enum虽然可以存储字符串,但对于内部来说,还是以顺序进行索引,比如'a','b','c',我们也可以用索引值来获取值select * from tbl_name whre enum = 2,这与select * from tbl_name where enum = 'b'等义)如果你看明白了这两句SQL为什么等义,那么你也就可以了解为什么不主张用enum字段了。

因为,如果一个设计不合理的ENUM字段,给程序员带来的就完全是梦魇了,比如一个enum字段的范围是('0','1','2','3','4','5'),我想这时候,你会不会哭呢?要知道enum的枚举值对应的索引是从1开始的,因此,insert into table (enum)values(1),你知道是插的什么值吗?你select from table一下,你就会发现,你插入的并不是1,而是0。

更有甚者,由于enum的区间也是可以变动的,如果你在enum的枚举字段范围中加一个值,并且不是加在最后,那么也就相当于,你把原来的范围都改变了索引值,试想这又是多么一个恐怖的事情?

因此,如果你的系统中真的已经使用了mysql的enum字段类型,请在查询的时候直接查询值(并加上单引号),这样就不会使用enum自身隐藏的索引值来获取结果了。【顺便说一下,enum的默认索引是从NULL开始,如果你允许NULL并default NULL】

之所以提起这个,是在用shopnc系统的时候发现大量这样的字段,让人非常郁闷,几乎没有办法优化(如果是纯数值型,还是建议采用tinyint字段吧,毕竟它也只占一个字节,即使出现赃数据,也可以被接受,不象enum,如果纯数字型范围,更改了索引,你就不知道你查询的值是否正确了)

因此建议,如果字段是字符串,并且长度固定,可以尝试用char,如果是数值型,还是用tinyint吧,比较安全稳定,而且即使迁移,问题也不大。

Tags: enum, mysql, tinyint

ThinkInLamp Mysql专场

在开始今天的话题之前,先感谢一下傲骨,在我向板子申请小海豚未果后,他让出了他的sun海豚。
再,感谢ThinkInLamp 组委会(http://www.thinkinlamp.com),也正是由于他们的努力,我们才有了今天这么一个专场(而且很多参与者也放弃了今天同时举办的其他几个专场,比如在篱笆网的前端专场(?UED??),还有复旦的ubuntu 10.10的专场等,好象还有一个,三马说了,也没有记清)
再,StingChen【http://my1930.com】在我们听讲的时候,努力的在新浪围脖【http://t.sina.com.cn/thinkinlamp】上拼命的在直播(如果他没有PPT,那就是他打字特别快了。。。)
然后就是赞助商和几位嘉宾了(感觉今天就是Action【爱可生】和盛大的专场,有些内容就不多写了,因为StingChen的新浪围脖直播上的内容详细程度堪比PPT啊【点击查看】,可惜不支持倒排。看的会稍微有点累)。
当然我们不能忽略一些幕后工作者,ThinkInLamp的组委会和一些志愿者,他们非常努力的想办好这次专场(据说很多人都是几乎一夜没睡,看到板子【http://blog.thephper.com】的脸都是白的,虽然他们没有经验,但非常努力)
OK,开始讲讲今天的内容吧。对于一些广告我就直接无视了,只记录讲技术的。
先是老谭(谭浚青)给大家介绍了Mysql的myisam与innodb的比较,虽然很多资料大家在应用中都有接触和了解,但他还是对于myisam的key buffer和innodb的bufferpool的调优有了介绍。其中他也介绍了一个小经验,是innodb调优的,说是如果raid卡上有电源模块,那么也就可以利用raid卡上的内存来优化redo log的传输性能。(好象没记错)老谭在介绍这些信息前也介绍了Action公司正在测试的一款新产品,利用服务器上的agent来进行mysql的监控(采用WEB方式进行管理,看他的几个截图倒是真的不错)
接下来就是盛大的赵佳佳介绍了SNS数据库的设计,主要介绍了一些数据库的拆分方案,可能由于小姑娘有点拘谨,虽然内容不错,但讲的一般,大概还是紧张了吧(不过,如果要是换成我,我还会更紧张)。对于数据库的拆分,还是传统的水平拆分和垂直拆分,这两点我就不多说了,网上资料更多。完了结束时,她介绍了Amoeba:分布式数据库Proxy(希望没说错)。
Oracle的杜玉松介绍了Mysql被收购后未来的一些roadmap,也算是让我们对MYSQL的未来有些信心,不至于过份迷惘吧。傲骨倒是对电信级的server非常感兴趣,只是我却对这些没有太大兴趣。当然分区表,也是我们关心的,用lvan的话来说这点在5.5的时候就会有很大的改进,不再象现在还会存在一些BUG,让人不太敢用(感觉好象说是可以智能分区了)
接下来又是盛大的哥们介绍数据库mangoDB【被人批评写错了,应该是mongodb】,对于这个数据库,了解的人真的很多,而且不管数据量的大小,很多人都也在进行尝试(只是我们的条件不如盛大,不太可能是一下子放上几十台服务器进行尝试)。这点就是小公司的DBA不如大公司的地方了,学习环境不够好啊(结束的时候,他略介绍了几个类似的数据库redis,tc等,在介绍memcache的时候说memcache的value最大只能有1M,而mangodbmongodb可以达到4M,但事实上从最近的1.4.2版开始,memcache在启动的时候加上参数,也可以指定value的最大值了)
最后让我有印象的是Action的杨涛涛,他是直接从代码上来介绍了数据库优化的了,讲的非常简洁,真的很简洁,几句话就带过了。不过有些技巧和经验还是让我眼前一亮。。
比如以下几个sql:

SQL代码
  1. Select * from t where name like '%de%'  
  2. Select * from t where name like 'de%' 这是可优化的  
  3. Select * from t where name >= 'de' and name < 'df' 如果字符串有规律也可以利用这种方式  
  4.   
  5. Select * from where 1  
  6. Select * from where 1 limi 10  
  7.   
  8. Left join 不能仅对子表判断,可以对主表加过滤条件,避免全表扫描 。  
  9.   
  10. Select sql_no_cache * from new_ext order by id asc limit 20000,20   
  11. Select sql_no_cache * from new_ext where id >= (select id from new_exit order by id ASC limit 20000,1) limit 20  
  12. 这样的效率比上面略高  

可惜杨涛涛对于存储过程、触发器、视图等没有过多的介绍,只是说了一下,视图,玩玩可以,不要在开发机上用就成(存储过程、触发器,我都在几年前看过,也做过一些小应用,只是,全忘光了,前段时间在导数据时,连个查询循环都搞不定了)
最后一位MM的mysql高可用性,我没有记录更多。。因为她介绍的几个方法,其实都已经在正式应用中了,虽然有考虑过換新的系统架构,但換的成本也会太高,不敢尝试。

当然也得提点建议,这次餐券的初衷挺好的,但给KFC造成了很大的压力呀,一下子,并发处理不过来了。
最后,感谢傲骨的小海豚,上两张相片:
大小: 656.94 K
尺寸: 500 x 375
浏览: 1765 次
点击打开新窗口浏览全图
大小: 618.56 K
尺寸: 500 x 375
浏览: 1709 次
点击打开新窗口浏览全图
大小: 603.51 K
尺寸: 282 x 376
浏览: 1719 次
点击打开新窗口浏览全图

Tags: thinkinlamp, mysql

Lnmp一键安装

如果你是VPS,又不太会配置系统,那么这个选择就挺不错的。。LNMP一键安装包,一下子就把所有的东西全部安装回来了,而且每增加一个域名之类的都不算特别难,当然前提是你最起码得懂一点点linux的操作,比如你会使用ssh,那样,你在vps下就能很方便的操作了(我今天操作了一次,只是安装的时候非常长,还好,国外的VPS速度很快,就是编译时间长了一点)
来吧,看步骤和内容吧。

系统需求:

  • 需要2 GB硬盘剩余空间
  • 128M以上内存
  • 安装步骤:

    1、下载LNMP一键安装包:
  • 可以选择使用下载版(推荐国外或者美国VPS使用)或者完整版(推荐国内VPS使用),如果使用下载版执行命令 wget -c http://soft.vpser.net/lnmp/lnmp0.5.tar.gz,如果使用完整版,执行命令 wget -c http://soft.vpser.net/lnmp/lnmp0.5-full.tar.gz,执行上述命令后LNMP一键安装包就会被下载到VPS上。

  • 2、解压LNMP一键安装包:
  • 执行tar zxvf lnmp0.5.tar.gz 或者tar zxvf lnmp0.5-full.tar.gz 就会将LNMP一键安装包解压缩。

  • 3、CentOS下安装步骤
  • 下载版执行命令 cd lnmp0.5/ ,完整版执行命令:cd lnmp0.5-full/
  • 然后再执行./centos.sh ,输入要绑定的域名,回车,再输入要设置的MySQL root的密码,再次回车确认。程序会自动安装编译Nginx、PHP、MySQL、phpMyAdmin、Zend这几个软件。

  • 4、Debian/Ubuntu下安装步骤
  • 下载版执行命令 cd lnmp0.5/ ,完整版执行命令:cd lnmp0.5-full/
  • 然后32位系统执行./debian.sh ,输入要绑定的域名,回车,再次输入VPS/服务器所在位置:asia、 america、europe、oceania或africa,回车,再输入要设置的MySQL root的密码,回车后,再次回车确认。程序会自动安装编译Nginx、PHP、MySQL、phpMyAdmin、Zend这几个软件。安装大约10分 钟左右需要设置MySQL root用户的密码。
  • 安装其他组件

  • 1、安装eAccelerator,执行如下命令:./eaccelerator.sh 就会自动安装并重启web服务。
  • 2、安装ionCube,执行如下命令:./ionCube.sh 就会自动安装并重启web服务。
  • 3、安装PureFTPd和管理面板,执行如下命令:./pureftpd.sh 就会自动安装PureFTPd,安装完PureFTPd,需要在浏览器执行http://你的域名或IP/ftp/install.php 安装PureFTPd用户管理。详细教程参考:http://www.vpser.net/manage/lnmp-pureftpd-cp.html
  • 4、安装VsFTPD,执行如下命令:./vsftpd.sh 就会自动安装上vsftpd,只需要执行命令:useradd -d /home/wwwroot -s /sbin/nologin adminftp 添加上帐号指定好ftp帐号的根目录,再执行:passwd adminftp 设置上密码,登录就可以了。
  • 虚拟主机管理

  • 1、添加虚拟主机,执行如下命令:/root/vhost.sh 根据提示输入要绑定的域名,回车,如果需要添加更多的域名,输入y,再输入要另外绑定的域名,多个域名可以用空格隔开。再输入域名绑定的目录(绝对目录, 如/home/wwwroot/lnmp,如果不填默认是/home/wwwroot/绑定的域名),再选择是否添加伪静态规则,默认已经有了 Discuz、Wordpress、Sablog、emlog、dabr,可直接输入以上名称即可,如果需要添加自定义伪静态规则,直接输入一个想要的名 字,程序会自动创建伪静态文件,直接在/usr/local/nginx/conf/你自定义的伪静态名字.conf 里面添加伪静态规则就行。接下来会提示是否需要启用日志功能,一般情况下不需要启动,直接输入n就行,如需启动,输入y,再输入要定义的日志文件名字,回 车就会自动添加虚拟主机。

  • 2、状态管理及相关管理页面
    LNMP状态管理: /root/lnmp {start|stop|reload|restart|kill|status}
    PureFTPd状态管理 /root/pureftpd {start|stop|restart|kill|status}
    phpinfo : http://前面输入的域名或IP/phpinfo.php
    phpMyAdmin : http://前面输入的域名或IP/phpmyadmin/
    探针 : http://前面输入的域名或IP/p.php
    MySQL root密码:如果不输入直接回车为root,否则为你输入的密码。

    LNMP相关目录:
    mysql : /usr/local/mysql
    php : /usr/local/php
    nginx : /usr/local/nginx
    网站目录: /home/wwwroot
  • 注:已经在DiaHostingPhotonVPS(感谢提供测试VPS)、RasHostVPSYOU、VPS.net、breezehostRapidxen 及几位lnmp网友提供的VPS上的CentOS 32/64bit、Debian 4/5 32/64bit上测试成功。同时感谢提供测试VPS的商家及网友。

    来源:http://lnmp.org/install.html

    Tags: nginx, php, linux, vps

    软件介绍:Link Shell Extension

    Linux下面有个link功能很爽。事实上就相当于建了一个快捷方式,可是他可以直接操作。但windows不太一样,比如我在D盘建一个E盘的快捷方式,命名为test,那我不可以用d:\test\www来访问e:\www这个目录,这个其实很不爽的。。

    LinkShellExtension这个软件我还没有用过,不过看上去好象不错,看介绍,好象是和linux下面的link差不多,所以我先转一份,等有空了,慢慢折腾

    Link Shell Extension 是一个可以在 NTFS 文件系统中创建“硬连接”的 Windows 资源管理器扩展。

    “硬连接”让一个文件在多个目录下重复出现,但只占用一份文件的空间。例如,一个大小为 10MB 的“E:\a.doc”的文件,创建一个硬连接到“E:\共享文件夹\a.doc”中,则两个“a.doc”文件只占用一个文件的空间(10MB),两个 文件的内容当然是完全一样的。如果编辑该文件的编辑器在修改保存文件时,依然保持源文件在 NTFS 文件夹中的位置,那么在“E:\a.doc”上所作的改动会自动反映到“E:\共享文件夹\a.doc”中。同理,修改了“E:\共享文件夹 \a.doc”文件后,所作的修改也会立即反映到硬连接对应的“E:\a.doc”文件。
    大小: 4.57 K
尺寸: 230 x 142
浏览: 1697 次
点击打开新窗口浏览全图
    创建硬连接之后,删除硬连接的副本(即连接点)只会将文件系统对文件数据的引用减一,只有删除所有的引用时,才真正删除文件。

    “硬连接”还可以用于目录,这称为“目录连接点”(Junction)。例如,可以为“C:\Applications”目录创建一个硬连接到“E:\共 享文件夹\Applications”,则两个目录共享同样的存储空间,在“C:\Applications”目录中对任何文件所作的改动都会立即反映到 “E:\共享文件夹\Applications”目录中对应的文件中去。同理,修改“E:\共享文件夹\Applications”目录中的文件,改动也 会立即反映到“C:\Applications”目录中去。

    对于目录连接点需要注意:目录连接点连接到原来的目录,如果将源目录删除,则其连接点将不再可用,这与文件硬连接是不同的。

    安装方法:
    1、到主页下载安装文件,执行安装;
    http://schinagl.priv.at/nt/hardlinkshellext/hardlinkshellext.html#contact
    2、在此下载汉化文件;
    3、使用资源管理器打开 Link Shell Extension 所安装到的目录,将“HardlinkShellExt.dll”重命名为其他名称的文件;
    4、将汉化文件解压到该目录;
    5、注销(或重启)后重新登录到 Windows。

    创建硬连接的操作方法:
    1、在 Windows 资源管理器中,找到需要创建硬连接的文件,如
    “E:\a.doc”;
    2、右键点击该文件,选择“选择源连接点”。
    3、转到需要创建连接点的地方,如“E:\共享文件夹”。
    4、右键点击资源管理器文件列表的空白位置,选择“创建硬连接”(如果是目录,可选择“创建连接点→目录连接点[或其他选项]”)——在资源管理器的状态栏中对操作命令有说明。

    --EOF--

    主要是我订阅了汉化新世纪的RSS,所以才会看到这个。。。http://www.hanzify.org//software/12331.html

    请简单介绍一下数据库事务的4大特性

    背景。。。yhustc在群内提问,突然发现自己的基础特别差。所以就找了一下,贴出来,权当笔记(原来心中的回滚是属于原子性啊。。)

    事务的:原子性、一致性、分离性、持久性
    原子性、一致性、分离性、持久性
    (1) 原子性
    事务的原子性指的是,事务中包含的程序作为数据库的逻辑工作单位,它所做的对数据修改操作要么全部执行,要么完全不执行。这种特性称为原子性。
    事务的原子性要求,如果把一个事务可看作是一个程序,它要么完整的被执行,要么完全不执行。就是说事务的操纵序列或者完全应用到数据库或者完全不影响数据库。这种特性称为原子性。
      假如用户在一个事务内完成了对数据库的更新,这时所有的更新对外部世界必须是可见的,或者完全没有更新。前者称事务已提交,后者称事务撤消(或流产)。DBMS必须确保由成功提交的事务完成的所有操纵在数据库内有完全的反映,而失败的事务对数据库完全没有影响。

    (2) 一致性
        事务的一致性指的是在一个事务执行之前和执行之后数据库都必须处于一致性状态。这种特性称为事务的一致性。假如数据库的状态满足所有的完整性约束,就说该数据库是一致的。
    一致性处理数据库中对所有语义约束的保护。假如数据库的状态满足所有的完整性约束,就说该数据库是一致的。例如,当数据库处于一致性状态S1时,对数据库执行一个事务,在事务执行期间假定数据库的状态是不一致的,当事务执行结束时,数据库处在一致性状态S2。

    (3) 分离性
    分离性指并发的事务是相互隔离的。即一个事务内部的操作及正在操作的数据必须封锁起来,不被其它企图进行修改的事务看到。
      分离性是DBMS针对并发事务间的冲突提供的安全保证。DBMS可以通过加锁在并发执行的事务间提供不同级别的分离。假如并发交叉执行的事务没有任何控制,操纵相同的共享对象的多个并发事务的执行可能引起异常情况。
    DBMS可以在并发执行的事务间提供不同级别的分离。分离的级别和并发事务的吞吐量之间存在反比关系。较多事务的可分离性可能会带来较高的冲突和较多的事务流产。流产的事务要消耗资源,这些资源必须要重新被访问。因此,确保高分离级别的DBMS需要更多的开销。

    (4)持久性
    持久性意味着当系统或介质发生故障时,确保已提交事务的更新不能丢失。即一旦一个事务提交,DBMS保证它对数据库中数据的改变应该是永久性的,耐得住任何系统故障。持久性通过数据库备份和恢复来保证。
    持久性意味着当系统或介质发生故障时,确保已提交事务的更新不能丢失。即对已提交事务的更新能恢复。一旦一个事务被提交,DBMS必须保证提供适当的冗余,使其耐得住系统的故障。所以,持久性主要在于DBMS的恢复性能。

    原文来自:http://zhidao.baidu.com/question/111111366