对于大?数web应用来?,数?都是??分基?性的部分。?果你在使用PHP,那么你很可能也在使用MySQL—LAMP系列?足轻重的?份子?
??对于很?新手?说,使用PHP?在短??时之内轻松地写出具有特定功能的代码?但?构建??定可靠的数据库却?要花上一些时日和相关?能?下面列举了我曾经犯过的?严重?1个MySQL相关的错?有些同样也反映在其他?/数据库的使用上)?

1.使用MyISAM而不是InnoDB
??MySQL有很多数?引擎,但???碰到的就是MyISAM和InnoDB?
??MySQL默?使用的是MyISAM。但?很?情况下这都是??糟糕的?择,除非你在创建一?常简单抑或实验?的数据库???束或者事务?理?于数?整?是非常重?的,但MyISAM都不?这些。另外,当有?条?录在插入或?更新时,整??都?锁定了,当使用量增加的时候这会产生非常差的运行效率??
??结?很简单:使用InnoDB?
2.使用PHP的mysql函数
??PHP?生之日就提供了MySQL库函数(or near as makes no difference)?很多应用仍然在使用类似mysql_connect、mysql_query、mysql_fetch_assoc等的函数,尽?HP手册上??
??如果你在使用MySQL v4.1.3或?更新版?强烈推荐使用您使用mysqli扩展?
??mysqli(MySQL的加强版扩展)有以下几个优点?
????的面向对象接口
??prepared表达式,这有利于阻?SQL注入攻击,还能提高?能
???更?的表达式和事务??
??另?,?果你想支持?种数?系统,你还可以?虑PDO?
3.没有处理用户输入
??这或者可以这样?#1:永远不要相信用户的输入。用服务器?的PHP验证每个字?串,不?寄希望与JavaScript。最?单的SQL注入攻击会利用?下的代码?
??$username = $_POST["name"];
??$password = $_POST["password"];
??$sql = “SELECT userid FROM usertable WHERE username=?username?AND password=?password??
??// run query?
????在username字?输入”admin?–?,这样就会?到,相应的SQL?如下?
??SELECT userid FROM usertable WHERE username=’admin?
??狡猾的黑客可以以admin登录,他??要知道密码,因为密码段?注释掉了?
4.没有使用UTF-8
??美国、英国和澳大利亚的我?少?虑除英?外的其他?。我?得意地完成了?的?杰作?却发现它们并不能在其他地方正常运??
??UTF-8解决了很多国际化??。虽然在PHP v6.0之前它还不能很好地??,但这并不影响你把MySQL字?集?为UTF-8?
5.相?于SQL,偏爱PHP
??如果你接?ySQL不久,那么你会偏向于使用你已经掌握的?来解决问题,这样会?致写出一些冗余?低效率的代码?比如,你不会使用MySQL?的AVG()函数,却会先对?录集?值求和然后用PHP?来?算平均???
??此?,?注意PHP??SQL查?。?常来?,执行一?询比在结果中?更有效率?
???以,在分析数?时??利用数据库系统的优势,懂?些SQL的知识将大有裨益?
6.没有优化数据库查?/strong>
??99%的PHP性能??都是由数?引起的,仅仅??糕的SQL查?就能让你的web应用彻底?。MySQL的EXPLAIN statement、Query Profiler,还有很多其他的工具将会?你找出这些万恶的SELECT?
7.不能正确使用数据类型
??MySQL提供了?如numeric、string和date等的数据类型。?果你想存储一?间,那么使用DATE或?DATETIME类型。?果这?候用INTEGER或?STRING类型的话,那么将会使得SQL查?非常复杂,前提是你能使用INTEGER或?STRING来定义那?型??
??很?人?向于擅?定义?些数?格式,比如,使用string来存储序列化的PHP对象。这样的话数?管理起来?会变得简单些,但会使得MySQL成为??糕的数据存储而且之后很可能会引起故障?
8.在查?使用*
??永远不?使用*来返回一???有列的数??这?惰:你应该提取你?要的数据。就算你?要所有字段,你的数据表也不可避免的会产生变化?
9.不使用索引或者过度使用索?/strong>
?????原则是这样的:select??任何?个where子句表示的字段都应?使用索引?
??举个例子,假设我??个user?包括numeric ID(主?和email address。登录的时?,MySQL必须以一个email为依?找??ID。?果使用了索引的话(这里指email),那么MySQL就能够使用更?搜索算法来定位email,甚至可以??时实现?否则,MySQL就只能顺序地?查每?条?录直到找到??email address?
?有的人会在每?段上都添加索引,遗憾的是,执行了INSERT或?UPDATE之后这些索引都需要重新生成,这样就会影响性能。所以,??要的时?添加索引??
10.忘?备份
??虽然比较罕?,但??还是有崩溃的危险。硬盘有?损坏,服务器有可能崩溃,web主机提供商有?会破产!丢失MySQL数据将会?难?的,所以??你已经使用了?备份或?已经?制到位??
11.Bonus mistake-不?虑使用其他数据?/strong>
??对于PHP?发人员来说,MySQL??用最广泛的数?系统,但并不??的?择。PostgreSQL和Firebird?强有力的竞争者:这个两?都?源的,?且都没有??收购。微?供了sql server Express,甲骨文提供?0g Express,这两?都?业级数据库的免费版本。有时?,对于??小的web应用或?嵌入式应用,SQLite也不失为??行的替代方??
原文:boobooke.com