µ±ǰλÖ㺠´úÂëÃÔ >> SQL >> PHPå¼?发è?…常çŠ?š„ʮ个MySQL错è?
  Ïêϸ½â¾ö·½°¸

PHPå¼?发è?…常çŠ?š„ʮ个MySQL错è?

Èȶȣº288   ·¢²¼ʱ¼䣺2016-05-05 12:14:57.0
PHPå¼?发è?…常çŠ?š„10个MySQL错è?

容陈旧,随着时间推移æŠ?æœ?�‘展变化è?Œ变得不适用。为了防止è?导新手,特本ç�?与时俱进的精神写出æ?文,绝非对原文作者的不尊重ã??/p>

1.使用MyISAM而不是InnoDB
完全错è?,反驳理由:
首先原文说MyISAMæ˜?»˜认使用的,è?Œ实际上到了MySQL 5.5.x,InnoDB已经成为了默认的表引擎ã??br style="margin: 0px; padding: 0px;">
另å?,简单的使用InnoDB不是解决æ‰?有问题的方法,盲ç›?š„使用甚至会使应用性能下降10%乃至40%ã€?br style="margin: 0px; padding: 0px;">
æœ?佳方法还æ˜?’ˆ对具体业务具体å?理,例å?论坛ä¸?‰ˆ块表,新闻分类表,各种码表等长时间不操作的表,还æ˜??用æ?§能优异的MyISAM引擎ã€?br style="margin: 0px; padding: 0px;">而需要用到事务å?理的例å?用户、账ç›??�流水等严格要求数据完整性和时序性的,则éœ?要用InnoDB引擎,并且应用也要用好事务å?理机制ã?‚当然,事务处理必然要带来大量的性能损è?—,但是这在ç®?单高并发应用上是必须的ã??br style="margin: 0px; padding: 0px;">
æœ?后,外键约束在公共web互联网应用上ä¸?èˆ?˜¯不用的,因为他会严重影响性能。数æ�?®Œ整æ?§还æ˜?� 程序员或者应用架构本èº?š„健壮来维护ã?‚è?Œæ?规的ç¬?¸‰范式å�?˜¯在企业内部MIS系统å’?2306这ç?网站上使用ã??br style="margin: 0px; padding: 0px;">
2.使用PHP的mysql方法
不完全错,但要酌情é?‰用ï¼?br style="margin: 0px; padding: 0px;">mysqli固然好,但是不是æ‰?有的服务器都为PHP编译了mysqli的支持ã??br style="margin: 0px; padding: 0px;">当你的应用å?果是能确定只用自己部署的服务å™?¼Œ而应用也æ˜?®Œ全自己开发,则mysqliæ˜?œ€好的选择ã€?br style="margin: 0px; padding: 0px;">但是ä¸?旦你的应用有å�?ƒ½部署在虚拟主机或者由其他人部署(例å?分布式项ç›?¼‰,还æ˜??�è?�实实使用mysql函数集吧,好好封装一下或者使用成熟æ?架杜绝sql注入ã€?br style="margin: 0px; padding: 0px;">
3.不过滤用户输å…?/span>
这一点不用è?了,要么MagicQuote,è?么é?‰用成熟框架。sql注入老话题了ã€?br style="margin: 0px; padding: 0px;">
4.不使用UTF-8
大部分情况下对,但也要è?真è?ƒ虑ï¼?br style="margin: 0px; padding: 0px;">要知道,ä¸?个UTF-8字ç?å�?ä¸?­—节,æ‰?以比GBK等其他编码的文件å¤?3%。换句话说,相同的网页用UTF-8编码如果æ˜?00KB,那么换成GBK编码则只æœ?6KB。所以即便你的PHPç¡?®š要用UTF-8,那么前ç«?¡µé�?¹Ÿ要根æ�?ƒ…况é?‰择éœ?要的编码。但æ˜?¼Œ如果PHP用UTF-8,前ç«?¨¡版是GBK,再加上模版引擎不强大,那么è½? �工作够你受的。所以尽å�?ƒ½的é?‰用è‡?·±éœ?要的编码,è?Œ不æ˜?®€单的选择UTF-8了事ã€?br style="margin: 0px; padding: 0px;">æœ?后啰嗦一句:UTF-8下:strlen("æˆ?)=3,è?ŒGBK下:strlen("æˆ?)=2

5.该用SQL的地方使用PHP
同样酌情考虑ï¼?br style="margin: 0px; padding: 0px;">例å?,有些人习惯在建表时,默认å?¼填写CURRENT_TIMESTAMP,用来达到注册时间ã?�发帖时间的效果ã€?或è?…在时间判断的SQLè¯?�¥ä¸?¼Œ写类似SELECT x FROM tab1 WHERE regdate < UNIX_TIMESTAMP()。那么我å�?ƒ½说,你为系统埋下了很隐蔽的BUG。因为数æ�?º“和应用往å¾?不在同一台机器上,时间很容易出现偏差。当你一套应用的时间参照不准ç¡?—¶,就会出现很大的é—??ã€?br style="margin: 0px; padding: 0px;">正确做法æ˜?¼š不è?使用MySQL的任何时间函数,而是在应用里计算时间。å?果是分布式应ç”?¼Œä¸?定è?有时间服务器来统ä¸?管理时间ã€?br style="margin: 0px; padding: 0px;">而文ä¸??的一些MySQL数å?函数 ,也æ˜??慎用。因为在大型应用ä¸?¼Œ数据库的负担å¾?å¾?æ˜?œ€大的,è?Œå?杂的WHEREè¯?�¥又是造成慢查询的元凶。所以,要把计算尽可能的放在廉价的ã?�不影响全局稳定的应用服务器上,而不æ˜? ¸心数æ�?º“上ã??br style="margin: 0px; padding: 0px;">
6.不优化查è¯?/span>
这点也不用è?了,大型应用上甚至不允è?使用各ç?JOIN,哪怕生写两条查è¯?¼Œ查回来在用PHP合并数据ã€?br style="margin: 0px; padding: 0px;">
7.使用错è?的数æ�?±»åž?/span>
INT,TinyINT,VARCHAR,CHAR,TEXT这些字æ?类型的合理é?‰用无可厚非ã€?br style="margin: 0px; padding: 0px;">而Date、DateTime、TIMESTAMP这三种类型,在大型应用中æ˜?»�对不å�?»¥使用的,而是要用INT(10) UNSIGNED代替ã€?br style="margin: 0px; padding: 0px;">ä¸?ä¸?˜¯性能,另外就æ˜?º”用中尤其是PHP对UNIX_TIMESTAMP时间戳的è½?Œ–实在å¤?–¹便了。用Date要输出各种时间格式反而麻烦ã??br style="margin: 0px; padding: 0px;">
8.在SELECT查è?ä¸?½¿ç”?
共勉

9.索引不足或è?…过度索å¼?/span>
索引æ˜?¿…须的,但æ˜??果索引都解决不了的查è¯?¼Œ考虑memcache或è?…nosql解决方æ?吧ã??br style="margin: 0px; padding: 0px;">
10.不å?ä»?/span>
这条æ˜?½œ者凑数么ï¼?br style="margin: 0px; padding: 0px;">
11.另å?:不考虑其他数据åº?/span>
这条相当正确。应用中不仅要针对应用é?‰择其他数据库,甚至还è?针å?具体的业务类型,在同ä¸?套应用中并è?使用多ç?数据库ã?‚哪怕不æ˜?•°æ�?º“,è?Œ是其他各ç?缓存、内存存储等解决方æ?

  Ïà¹ؽâ¾ö·½°¸